<?xml version="1.0" encoding="utf-8" standalone="no"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0"><channel><title>The Daily WTF</title><link>http://thedailywtf.com/</link><description>Curious Perversions in Information Technology</description><lastBuildDate>Tue, 08 Sep 2026 08:21:09 GMT</lastBuildDate><item><dc:creator>Remy Porter</dc:creator><title>Best of…: Classic WTF: A Dumbain Specific Language</title><link>https://thedailywtf.com/articles/classic-wtf-a-dumbain-specific-language</link><category>Best of…</category><pubDate>Mon, 07 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/classic-wtf-a-dumbain-specific-language</guid><description>&lt;blockquote&gt;It&amp;#39;s a holiday here in the US, a celebration of labor, so we&amp;#39;re reaching back through the archives for a story about an attempt to be labor saving that was not successful. &lt;a href="https://thedailywtf.com/articles/a-dumbain-specific-language"&gt;Original&lt;/a&gt;. --&lt;strong&gt;Remy&lt;/strong&gt;&lt;/blockquote&gt;

&lt;p&gt;I’ve had to write a few domain-specific-languages in the past. As per &lt;a href="https://twitter.com/RemyPorter/status/752913168624746497"&gt;Remy’s Law of Requirements Gathering&lt;/a&gt;, it’s been mostly because the users needed an Excel-like formula language. &lt;!-- Although, more than once, it's been because I wanted to hack a macro system into a DSL for fun, as per my unfinished multiplayer CYOA engine written in Elixir --&gt; The danger of DSLs, of course, is that they’re often YAGNI in the extreme, or at least a sign that you don’t really understand your problem.&lt;/p&gt;

&lt;p&gt;XML, coupled with schemas, is a tool for building data-focused DSLs. If you have some complex structure, you can convert each of its features into an XML attribute. For example, if you had a grammar that looked something like this:&lt;/p&gt;
&lt;blockquote&gt;&lt;pre&gt;The Source specification obeys the following syntax

source = ( Feature1+Feature2+... &amp;#34;:&amp;#34; ) ? steps

Feature1 = &amp;#34;local&amp;#34; | &amp;#34;global&amp;#34;

Feature2 =&amp;#34;real&amp;#34; | &amp;#34;virtual&amp;#34; | &amp;#34;ComponentType.all&amp;#34;

Feature3 =&amp;#34;self&amp;#34; | &amp;#34;ancestors&amp;#34; | &amp;#34;descendants&amp;#34; | &amp;#34;Hierarchy.all&amp;#34;

Feature4 = &amp;#34;first&amp;#34; | &amp;#34;last&amp;#34; | &amp;#34;DayAllocation.all&amp;#34;

If features are specified, the order of features as given above has strictly to be followed.

steps = oneOrMoreNameSteps | zeroOrMoreNameSteps | componentSteps

oneOrMoreNameSteps = nameStep ( &amp;#34;.&amp;#34; nameStep ) *

zeroOrMoreNameSteps = ( nameStep &amp;#34;.&amp;#34; ) *

nameStep = &amp;#34;#&amp;#34; name

name is a string of characters from &amp;#34;A&amp;#34;-&amp;#34;Z&amp;#34;, &amp;#34;a&amp;#34;-&amp;#34;z&amp;#34;, &amp;#34;0&amp;#34;-&amp;#34;9&amp;#34;, &amp;#34;-&amp;#34; and &amp;#34;_&amp;#34;. No umlauts allowed, one character is minimum.

componentSteps is a list of valid values, see below.

Valid &amp;#39;componentSteps&amp;#39; are:

- GlobalValue
- Product
- Product.Brand
- Product.Accommodation
- Product.Accommodation.SellingAccom
- Product.Accommodation.SellingAccom.Board
- Product.Accommodation.SellingAccom.Unit
- Product.Accommodation.SellingAccom.Unit.SellingUnit
- Product.OnewayFlight
- Product.OnewayFlight.BookingClass
- Product.ReturnFlight
- Product.ReturnFlight.BookingClass
- Product.ReturnFlight.Inbound
- Product.ReturnFlight.Outbound
- Product.&lt;span onclick="cornify_add();return false;" title="click me!"&gt;Addon&lt;/span&gt;&lt;script type="text/javascript" src="//www.cornify.com/js/cornify.js"&gt;&lt;/script&gt;
- Product.Addon.Service
- Product.Addon.ServiceFeature

In addition to that all subsequent steps from the paths above are permitted, that is &amp;#39;Board&amp;#39;, 
&amp;#39;Accommodation.SellingAccom&amp;#39; or &amp;#39;SellingAccom.Unit.SellingUnit&amp;#39;.
&amp;#39;Accommodation.Unit&amp;#39; in the contrary is not permitted, as here some intermediate steps are missing.&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;You could turn that grammar into an XML document by converting syntax elements to attributes and elements. You could do that, but &lt;strong&gt;Stella’s&lt;/strong&gt; predecessor did not do that. That of course, would have been &lt;em&gt;work&lt;/em&gt;, and they may have had to put some thought on how to relate their homebrew grammar to XSD rules, so instead they created an XML schema rule for &lt;code&gt;SourceAttributeType&lt;/code&gt; that verifies that the data in the field is valid according to the grammar… using regular expressions. 1,310 characters of regular expressions.&lt;/p&gt;
&lt;pre&gt;&lt;code class="xml"&gt;&amp;lt;xs:simpleType&amp;gt;
    &amp;lt;xs:restriction base=&amp;#34;xs:string&amp;#34;&amp;gt;
            &amp;lt;xs:pattern value=&amp;#34;(((Scope.)?(global|local|current)\+?)?((((ComponentType.)?
(real|virtual))|ComponentType.all)\+?)?((((Hierarchy.)?(self|ancestors|descendants))|Hierarchy.all)\+?)?
((((DayAllocation.)?(first|last))|DayAllocation.all)\+?)?:)?(#[A-Za-z0-9\-_]+(\.(#[A-Za-z0-9\-_]+))*|(#[A-Za-z0-
9\-_]+\.)*
(ThisComponent|GlobalValue|Product|Product\.Brand|Product\.Accommodation|Product\.Accommodation\.SellingAccom|Prod
uct\.Accommodation\.SellingAccom\.Board|Product\.Accommodation\.SellingAccom\.Unit|Product\.Accommodation\.Selling
Accom\.Unit\.SellingUnit|Product\.OnewayFlight|Product\.OnewayFlight\.BookingClass|Product\.ReturnFlight|Product\.
ReturnFlight\.BookingClass|Product\.ReturnFlight\.Inbound|Product\.ReturnFlight\.Outbound|Product\.Addon|Product\.
Addon\.Service|Product\.Addon\.ServiceFeature|Brand|Accommodation|Accommodation\.SellingAccom|Accommodation\.Selli
ngAccom\.Board|Accommodation\.SellingAccom\.Unit|Accommodation\.SellingAccom\.Unit\.SellingUnit|OnewayFlight|Onewa
yFlight\.BookingClass|ReturnFlight|ReturnFlight\.BookingClass|ReturnFlight\.Inbound|ReturnFlight\.Outbound|Addon|A
ddon\.Service|Addon\.ServiceFeature|SellingAccom|SellingAccom\.Board|SellingAccom\.Unit|SellingAccom\.Unit\.Sellin
gUnit|BookingClass|Inbound|Outbound|Service|ServiceFeature|Board|Unit|Unit\.SellingUnit|SellingUnit))&amp;#34;/&amp;gt;
    &amp;lt;/xs:restriction&amp;gt;
&amp;lt;/xs:simpleType&amp;gt;
&amp;lt;/xs:union&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There’s a bug in that regex that Stella needed to fix. As she put it: “Every time you evaluate it a few little kitties die because you shouldn’t use kitties to polish your car. I’m so, so sorry, little kitties…”&lt;/p&gt;

&lt;p&gt;The full, unexcerpted code is below, so… at least it has documentation. In two languages!&lt;/p&gt;
&lt;pre&gt;&lt;code class="xml"&gt;&amp;lt;xs:simpleType name=&amp;#34;SourceAttributeType&amp;#34;&amp;gt;
                &amp;lt;xs:annotation&amp;gt;
                        &amp;lt;xs:documentation xml:lang=&amp;#34;de&amp;#34;&amp;gt;
                Die Source Angabe folgt folgender Syntax

                        source = ( Eigenschaft1+Eigenschaft2+... &amp;#34;:&amp;#34; ) ? steps

                        Eigenschaft1 = &amp;#34;local&amp;#34; | &amp;#34;global&amp;#34;

                        Eigenschaft2 =&amp;#34;real&amp;#34; | &amp;#34;virtual&amp;#34; | &amp;#34;ComponentType.all&amp;#34;

                        Eigenschaft3 =&amp;#34;self&amp;#34; | &amp;#34;ancestors&amp;#34; | &amp;#34;descendants&amp;#34; | &amp;#34;Hierarchy.all&amp;#34;

                        Eigenschaft4 = &amp;#34;first&amp;#34; | &amp;#34;last&amp;#34; | &amp;#34;DayAllocation.all&amp;#34;

                        Falls Eigenschaften angegeben werden muss zwingend die oben angegebene Reihenfolge der Eigenschaften eingehalten werden.

                        steps = oneOrMoreNameSteps | zeroOrMoreNameSteps | componentSteps

                        oneOrMoreNameSteps = nameStep ( &amp;#34;.&amp;#34; nameStep ) *

                        zeroOrMoreNameSteps = ( nameStep &amp;#34;.&amp;#34; ) *

                        nameStep = &amp;#34;#&amp;#34; name

                        name ist eine Folge von Zeichen aus der Menge &amp;#34;A&amp;#34;-&amp;#34;Z&amp;#34;, &amp;#34;a&amp;#34;-&amp;#34;z&amp;#34;, &amp;#34;0&amp;#34;-&amp;#34;9&amp;#34;, &amp;#34;-&amp;#34; und &amp;#34;_&amp;#34;. Keine Umlaute. Mindestens ein Zeichen

                        componentSteps ist eine Liste gültiger Werte, siehe im folgenden

                Gültige &amp;#39;componentSteps&amp;#39; sind zunächst:

                        - GlobalValue
                        - Product
                        - Product.Brand
                        - Product.Accommodation
                        - Product.Accommodation.SellingAccom
                        - Product.Accommodation.SellingAccom.Board
                        - Product.Accommodation.SellingAccom.Unit
                        - Product.Accommodation.SellingAccom.Unit.SellingUnit
                        - Product.OnewayFlight
                        - Product.OnewayFlight.BookingClass
                        - Product.ReturnFlight
                        - Product.ReturnFlight.BookingClass
                        - Product.ReturnFlight.Inbound
                        - Product.ReturnFlight.Outbound
                        - Product.Addon
                        - Product.Addon.Service
                        - Product.Addon.ServiceFeature

                Desweiteren sind alle Unterschrittfolgen aus obigen Pfaden erlaubt, also &amp;#39;Board&amp;#39;, &amp;#39;Accommodation.SellingAccom&amp;#39; oder &amp;#39;SellingAccom.Unit.SellingUnit&amp;#39;.
                &amp;#39;Accommodation.Unit&amp;#39; hingegen ist nicht erlaubt, da in diesem Fall einige Zwischenschritte fehlen.

                                &amp;lt;/xs:documentation&amp;gt;
                        &amp;lt;xs:documentation xml:lang=&amp;#34;en&amp;#34;&amp;gt;
                                The Source specification obeys the following syntax

                                source = ( Feature1+Feature2+... &amp;#34;:&amp;#34; ) ? steps

                                Feature1 = &amp;#34;local&amp;#34; | &amp;#34;global&amp;#34;

                                Feature2 =&amp;#34;real&amp;#34; | &amp;#34;virtual&amp;#34; | &amp;#34;ComponentType.all&amp;#34;

                                Feature3 =&amp;#34;self&amp;#34; | &amp;#34;ancestors&amp;#34; | &amp;#34;descendants&amp;#34; | &amp;#34;Hierarchy.all&amp;#34;

                                Feature4 = &amp;#34;first&amp;#34; | &amp;#34;last&amp;#34; | &amp;#34;DayAllocation.all&amp;#34;

                                If features are specified, the order of features as given above has strictly to be followed.

                                steps = oneOrMoreNameSteps | zeroOrMoreNameSteps | componentSteps

                                oneOrMoreNameSteps = nameStep ( &amp;#34;.&amp;#34; nameStep ) *

                                zeroOrMoreNameSteps = ( nameStep &amp;#34;.&amp;#34; ) *

                                nameStep = &amp;#34;#&amp;#34; name

                                name is a string of characters from &amp;#34;A&amp;#34;-&amp;#34;Z&amp;#34;, &amp;#34;a&amp;#34;-&amp;#34;z&amp;#34;, &amp;#34;0&amp;#34;-&amp;#34;9&amp;#34;, &amp;#34;-&amp;#34; and &amp;#34;_&amp;#34;. No umlauts allowed, one character is minimum.

                                componentSteps is a list of valid values, see below.

                                Valid &amp;#39;componentSteps&amp;#39; are:

                                - GlobalValue
                                - Product
                                - Product.Brand
                                - Product.Accommodation
                                - Product.Accommodation.SellingAccom
                                - Product.Accommodation.SellingAccom.Board
                                - Product.Accommodation.SellingAccom.Unit
                                - Product.Accommodation.SellingAccom.Unit.SellingUnit
                                - Product.OnewayFlight
                                - Product.OnewayFlight.BookingClass
                                - Product.ReturnFlight
                                - Product.ReturnFlight.BookingClass
                                - Product.ReturnFlight.Inbound
                                - Product.ReturnFlight.Outbound
                                - Product.Addon
                                - Product.Addon.Service
                                - Product.Addon.ServiceFeature

                                In addition to that all subsequent steps from the paths above are permitted, that is &amp;#39;Board&amp;#39;, &amp;#39;Accommodation.SellingAccom&amp;#39; or &amp;#39;SellingAccom.Unit.SellingUnit&amp;#39;.
                                &amp;#39;Accommodation.Unit&amp;#39; in the contrary is not permitted, as here some intermediate steps are missing.

                        &amp;lt;/xs:documentation&amp;gt;
                &amp;lt;/xs:annotation&amp;gt;
                &amp;lt;xs:union&amp;gt;
                        &amp;lt;xs:simpleType&amp;gt;
                                &amp;lt;xs:restriction base=&amp;#34;xs:string&amp;#34;&amp;gt;
                                        &amp;lt;xs:pattern value=&amp;#34;(((Scope.)?(global|local|current)\+?)?((((ComponentType.)?(real|virtual))|ComponentType.all)\+?)?((((Hierarchy.)?(self|ancestors|descendants))|Hierarchy.all)\+?)?((((DayAllocation.)?(first|last))|DayAllocation.all)\+?)?:)?(#[A-Za-z0-9\-_]+(\.(#[A-Za-z0-9\-_]+))*|(#[A-Za-z0-9\-_]+\.)*(ThisComponent|GlobalValue|Product|Product\.Brand|Product\.Accommodation|Product\.Accommodation\.SellingAccom|Product\.Accommodation\.SellingAccom\.Board|Product\.Accommodation\.SellingAccom\.Unit|Product\.Accommodation\.SellingAccom\.Unit\.SellingUnit|Product\.OnewayFlight|Product\.OnewayFlight\.BookingClass|Product\.ReturnFlight|Product\.ReturnFlight\.BookingClass|Product\.ReturnFlight\.Inbound|Product\.ReturnFlight\.Outbound|Product\.Addon|Product\.Addon\.Service|Product\.Addon\.ServiceFeature|Brand|Accommodation|Accommodation\.SellingAccom|Accommodation\.SellingAccom\.Board|Accommodation\.SellingAccom\.Unit|Accommodation\.SellingAccom\.Unit\.SellingUnit|OnewayFlight|OnewayFlight\.BookingClass|ReturnFlight|ReturnFlight\.BookingClass|ReturnFlight\.Inbound|ReturnFlight\.Outbound|Addon|Addon\.Service|Addon\.ServiceFeature|SellingAccom|SellingAccom\.Board|SellingAccom\.Unit|SellingAccom\.Unit\.SellingUnit|BookingClass|Inbound|Outbound|Service|ServiceFeature|Board|Unit|Unit\.SellingUnit|SellingUnit))&amp;#34;/&amp;gt;
                                &amp;lt;/xs:restriction&amp;gt;
                        &amp;lt;/xs:simpleType&amp;gt;
                &amp;lt;/xs:union&amp;gt;
&amp;lt;/xs:simpleType&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;!-- Easy Reader Version: Something, something, Zalgo joke. --&gt;
&lt;link rel="stylesheet" href="//thedailywtf.com/images/highlight/styles/github.css"/&gt;
&lt;script src="//thedailywtf.com/images/highlight/highlight.pack.js"&gt;&lt;/script&gt;
&lt;script&gt;hljs.initHighlightingOnLoad();&lt;/script&gt;
&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;BuildMaster&lt;/a&gt; allows you to create a self-service release management platform that allows different teams to manage their applications. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Explore how!&lt;/a&gt; 
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>7</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/classic-wtf-a-dumbain-specific-language</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Good Time</title><link>https://thedailywtf.com/articles/good-time</link><category>Error'd</category><pubDate>Fri, 04 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/good-time</guid><description>&lt;p&gt;Astute readers noticed last week that this editor (that is to say, me) had his own error&amp;#39;d failure to remember what day it was. Thank you for pointing it out promptly, and then proceeding to send in a bunch of examples of &lt;em&gt;other&lt;/em&gt; sites calendar failures.  Misery loves company!&lt;/p&gt;

&lt;p&gt;Traveler&amp;#39;s travails, from
&lt;strong&gt;C_Chell&lt;/strong&gt; 
&amp;#34;Trying to complete the form on https://www.ihg.com to tell when
I plan to arrive at the hotel, I can&amp;#39;t complete
the form because of this little time problem.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#06036a0253dc4d61b4bd648ab59c2dae"&gt;&lt;img itemprop="image" border="0" alt="06036a0253dc4d61b4bd648ab59c2dae" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/30/06036a0253dc4d61b4bd648ab59c2dae.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;You Have -1 Month(s) To Order!&amp;#34; announces 
&lt;strong&gt;dragoncoder047&lt;/strong&gt;.
&amp;#34;Ah, GradImages... the company that told all graduates that they&amp;#39;d
get a free 5x7 but tried to charge me for
it, then refused to honor my &amp;#34;unsubscribe&amp;#34; request and is
*still* emailing me to this day... Can&amp;#39;t do date math?
Par for the course.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#1820ae48b9df4a759ffbde45a8c715e0"&gt;&lt;img itemprop="image" border="0" alt="1820ae48b9df4a759ffbde45a8c715e0" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/30/1820ae48b9df4a759ffbde45a8c715e0.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Stansted Temporal UI design&amp;#34; shared by 
&lt;strong&gt;Michael R.&lt;/strong&gt;
&amp;#34;While waiting for a friend to arrive at Stansted I
see this. I better fire up the DeLorean to pick
her up at 00:06 tomorrow.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#8fa526db89fe46d88d6d2597fe0fa3ae"&gt;&lt;img itemprop="image" border="0" alt="8fa526db89fe46d88d6d2597fe0fa3ae" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/30/8fa526db89fe46d88d6d2597fe0fa3ae.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;While he was hunting through the website, 
&lt;strong&gt;Michael R.&lt;/strong&gt; also found that
&amp;#34;The Stansted airport website seems to suffer from Directional Confusion.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#89c37786ca724e82868eaab4f7285fcf"&gt;&lt;img itemprop="image" border="0" alt="89c37786ca724e82868eaab4f7285fcf" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/30/89c37786ca724e82868eaab4f7285fcf.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;Nothing wrong with the calendar here, but 
&lt;strong&gt;Slaoput&lt;/strong&gt; simply opposes mandatory existence. 
&amp;#34;I was filling out a form that said the Birthdate
is optional, but when I hit submit I found out
it was required. (I guess technically you have to be
born to fill out the form.)&amp;#34;
&lt;br/&gt;&lt;b&gt;NOT&lt;/b&gt; TO BE!
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#8bf00b3dc8ae4ca19481b42b9e63d0f4"&gt;&lt;img itemprop="image" border="0" alt="8bf00b3dc8ae4ca19481b42b9e63d0f4" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/30/8bf00b3dc8ae4ca19481b42b9e63d0f4.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;
&lt;div&gt;
	[Advertisement] Picking up &lt;b&gt;NuGet&lt;/b&gt; is easy. Getting good at it takes time. &lt;a href="https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&amp;amp;utm_medium=Footerad&amp;amp;utm_campaign=nuget"&gt;Download our guide to learn the best practice of NuGet for the Enterprise.&lt;/a&gt;

&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>15</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/good-time</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Heating Up</title><link>https://thedailywtf.com/articles/heating-up</link><category>CodeSOD</category><pubDate>Thu, 03 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/heating-up</guid><description>&lt;p&gt;A common option for retrofitting heating and cooling into older homes is a mini-split, frequently tied to a heat pump. They&amp;#39;re (relatively) cheap to install, energy efficient, and can be added without substantial modifications to the home. They also, annoyingly, are mostly controlled via IR remotes, making them challenging to wire up to home automation or even a household thermostat.&lt;/p&gt;
&lt;p&gt;People have made solutions, and today&amp;#39;s code comes from one of those solutions. Which, I want to stress, this code comes from an open source project for home automation, so it&amp;#39;s not &lt;em&gt;the code&lt;/em&gt; that&amp;#39;s wrong, here. At first I thought it was, and had a moment of, &amp;#34;I&amp;#39;m not going to pick on some hobby project,&amp;#34; but then I realised the hobby project points at a deeper issue.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;&lt;span class="hljs-comment"&gt;// temperature helper these are direct mappings based on the remote&lt;/span&gt;
&lt;span class="hljs-function"&gt;&lt;span class="hljs-type"&gt;float&lt;/span&gt; &lt;span class="hljs-title"&gt;toFahrenheit&lt;/span&gt;&lt;span class="hljs-params"&gt;(&lt;span class="hljs-type"&gt;float&lt;/span&gt; fromCelsius)&lt;/span&gt; &lt;/span&gt;{
    &lt;span class="hljs-comment"&gt;// Lookup table for specific mappings&lt;/span&gt;
    &lt;span class="hljs-type"&gt;const&lt;/span&gt; std::map&amp;lt;&lt;span class="hljs-type"&gt;float&lt;/span&gt;, &lt;span class="hljs-type"&gt;int&lt;/span&gt;&amp;gt; lookupTable = {
        {&lt;span class="hljs-number"&gt;16.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;61&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;16.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;62&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;17.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;63&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;17.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;64&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;18.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;65&lt;/span&gt;},
        {&lt;span class="hljs-number"&gt;18.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;66&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;19.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;67&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;20.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;68&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;21.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;69&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;21.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;70&lt;/span&gt;},
        {&lt;span class="hljs-number"&gt;22.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;71&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;22.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;72&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;23.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;73&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;23.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;74&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;24.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;75&lt;/span&gt;},
        {&lt;span class="hljs-number"&gt;24.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;76&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;25.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;77&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;25.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;78&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;26.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;79&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;26.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;80&lt;/span&gt;},
        {&lt;span class="hljs-number"&gt;27.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;81&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;27.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;82&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;28.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;83&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;28.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;84&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;29.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;85&lt;/span&gt;},
        {&lt;span class="hljs-number"&gt;29.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;86&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;30.0&lt;/span&gt;, &lt;span class="hljs-number"&gt;87&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;30.5&lt;/span&gt;, &lt;span class="hljs-number"&gt;88&lt;/span&gt;}
    };

    &lt;span class="hljs-comment"&gt;// Check if the input is in the lookup table&lt;/span&gt;
    &lt;span class="hljs-keyword"&gt;auto&lt;/span&gt; it = lookupTable.&lt;span class="hljs-built_in"&gt;find&lt;/span&gt;(fromCelsius);
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (it != lookupTable.&lt;span class="hljs-built_in"&gt;end&lt;/span&gt;()) {
        &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; it-&amp;gt;second;
    }

    &lt;span class="hljs-comment"&gt;// Default conversion and rounding to nearest integer&lt;/span&gt;
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-built_in"&gt;roundf&lt;/span&gt;(fromCelsius * &lt;span class="hljs-number"&gt;1.8&lt;/span&gt; + &lt;span class="hljs-number"&gt;32.0&lt;/span&gt;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Okay, I &lt;em&gt;am&lt;/em&gt; going to pick on their code a little bit; using &lt;code&gt;float&lt;/code&gt; as a key in a &lt;code&gt;map&lt;/code&gt; is asking for trouble, because rounding errors are going to surprise you. But honestly, failing to find the key you&amp;#39;re looking for is &lt;em&gt;better&lt;/em&gt; than the opposite, since that actually does the correct thing. Because if you look carefully at the table, you&amp;#39;ll see that it&amp;#39;s &lt;em&gt;wrong&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;18C, for example, should be 64F. Well, 64.4F, but we&amp;#39;re rounding to an integer. The choice here is to roughly map every 0.5C increase to a 1F increase, which is not the conversion factor. They try and correct- note how the table mostly steps by 0.5C, but skips 19.5C.&lt;/p&gt;
&lt;p&gt;The opposite direction is similarly bad:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;&lt;span class="hljs-comment"&gt;// temperature helper these are direct mappings based on the remote&lt;/span&gt;
&lt;span class="hljs-function"&gt;&lt;span class="hljs-type"&gt;float&lt;/span&gt; &lt;span class="hljs-title"&gt;toCelsius&lt;/span&gt;&lt;span class="hljs-params"&gt;(&lt;span class="hljs-type"&gt;float&lt;/span&gt; fromFahrenheit)&lt;/span&gt; &lt;/span&gt;{
    &lt;span class="hljs-comment"&gt;// Lookup table for specific mappings&lt;/span&gt;
    &lt;span class="hljs-type"&gt;const&lt;/span&gt; std::map&amp;lt;&lt;span class="hljs-type"&gt;int&lt;/span&gt;, &lt;span class="hljs-type"&gt;float&lt;/span&gt;&amp;gt; lookupTable = {
        {&lt;span class="hljs-number"&gt;61&lt;/span&gt;, &lt;span class="hljs-number"&gt;16.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;62&lt;/span&gt;, &lt;span class="hljs-number"&gt;16.5&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;63&lt;/span&gt;, &lt;span class="hljs-number"&gt;17.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;64&lt;/span&gt;, &lt;span class="hljs-number"&gt;17.5&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;65&lt;/span&gt;, &lt;span class="hljs-number"&gt;18.0&lt;/span&gt;},
        {&lt;span class="hljs-number"&gt;66&lt;/span&gt;, &lt;span class="hljs-number"&gt;18.5&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;67&lt;/span&gt;, &lt;span class="hljs-number"&gt;19.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;68&lt;/span&gt;, &lt;span class="hljs-number"&gt;20.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;69&lt;/span&gt;, &lt;span class="hljs-number"&gt;21.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;70&lt;/span&gt;, &lt;span class="hljs-number"&gt;21.5&lt;/span&gt;},
        {&lt;span class="hljs-number"&gt;71&lt;/span&gt;, &lt;span class="hljs-number"&gt;22.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;72&lt;/span&gt;, &lt;span class="hljs-number"&gt;22.5&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;73&lt;/span&gt;, &lt;span class="hljs-number"&gt;23.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;74&lt;/span&gt;, &lt;span class="hljs-number"&gt;23.5&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;75&lt;/span&gt;, &lt;span class="hljs-number"&gt;24.0&lt;/span&gt;},
        {&lt;span class="hljs-number"&gt;76&lt;/span&gt;, &lt;span class="hljs-number"&gt;24.5&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;77&lt;/span&gt;, &lt;span class="hljs-number"&gt;25.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;78&lt;/span&gt;, &lt;span class="hljs-number"&gt;25.5&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;79&lt;/span&gt;, &lt;span class="hljs-number"&gt;26.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;80&lt;/span&gt;, &lt;span class="hljs-number"&gt;26.5&lt;/span&gt;},
        {&lt;span class="hljs-number"&gt;81&lt;/span&gt;, &lt;span class="hljs-number"&gt;27.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;82&lt;/span&gt;, &lt;span class="hljs-number"&gt;27.5&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;83&lt;/span&gt;, &lt;span class="hljs-number"&gt;28.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;84&lt;/span&gt;, &lt;span class="hljs-number"&gt;28.5&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;85&lt;/span&gt;, &lt;span class="hljs-number"&gt;29.0&lt;/span&gt;},
        {&lt;span class="hljs-number"&gt;86&lt;/span&gt;, &lt;span class="hljs-number"&gt;29.5&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;87&lt;/span&gt;, &lt;span class="hljs-number"&gt;30.0&lt;/span&gt;}, {&lt;span class="hljs-number"&gt;88&lt;/span&gt;, &lt;span class="hljs-number"&gt;30.5&lt;/span&gt;}
    };

    &lt;span class="hljs-comment"&gt;// Check if the input is in the lookup table&lt;/span&gt;
    &lt;span class="hljs-keyword"&gt;auto&lt;/span&gt; it = lookupTable.&lt;span class="hljs-built_in"&gt;find&lt;/span&gt;(&lt;span class="hljs-built_in"&gt;static_cast&lt;/span&gt;&amp;lt;&lt;span class="hljs-type"&gt;int&lt;/span&gt;&amp;gt;(fromFahrenheit));
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (it != lookupTable.&lt;span class="hljs-built_in"&gt;end&lt;/span&gt;()) {
        &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; it-&amp;gt;second;
    }

    &lt;span class="hljs-comment"&gt;// Default conversion and rounding to nearest 0.5&lt;/span&gt;
    &lt;span class="hljs-keyword"&gt;return&lt;/span&gt; &lt;span class="hljs-built_in"&gt;roundf&lt;/span&gt;((fromFahrenheit - &lt;span class="hljs-number"&gt;32.0&lt;/span&gt;) / &lt;span class="hljs-number"&gt;1.8&lt;/span&gt; * &lt;span class="hljs-number"&gt;2&lt;/span&gt;) / &lt;span class="hljs-number"&gt;2.0&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Here, we can be off by as much as a 1C, which is certainly a noticeable feeling.&lt;/p&gt;
&lt;p&gt;At first glance, I thought this was just a misguided attempt at optimizing the lookup. For common values, do a lookup instead of calculating because it&amp;#39;s faster. Seems like the kind of mistake a hobby project might make, and definitely not a WTF. But it&amp;#39;s the comment which corrects me: &lt;code&gt;these are direct mappings based on the remote&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;These remotes usually have a display. So when you see on the remote that you&amp;#39;re trying to set the temperature to a comfortable 72F, the remote is actually sending 22.5C to the unit. That&amp;#39;s the actual temperature being sent.&lt;/p&gt;
&lt;p&gt;Now, why on Earth does the remote behave this way? Well, I haven&amp;#39;t cracked one open to read off the part numbers, but I&amp;#39;m going to go out on a limb and guess that the microcontoller in the remote doesn&amp;#39;t handle floating point operations all that well. So it almost certainly does use a lookup table to decide what signal to send, and the lookup table is populated by &amp;#34;good enough&amp;#34; approximations of temperature conversions. There aren&amp;#39;t a &lt;em&gt;lot&lt;/em&gt; of places that use Fahrenheit, so being &amp;#34;close enough&amp;#34; is a reasonable solution. If you want accurate temperatures, use SI units, not &amp;#34;freedom units&amp;#34;.&lt;/p&gt;
&lt;p&gt;In the end, I&amp;#39;d say that neither the hobby project, nor the remote control are the WTF here; locales that insist on using weird ass units are.&lt;/p&gt;
&lt;!-- Easy Reader Version: Rankine is, of course, the most absurd version of this: keep the Fahrenheit scaling, but anchor at absolute zero, like Kelvin, though it's also worth reading up on the both the Newton scale and the Rømer scale, because "coming up with a canonical temperature measurement" was a hard thing to do in the early modern period! It was cutting edge science! Weird scales were a natural reaction to trying to find reproducible conditions. --&gt;
&lt;style&gt;.comment { border: none }&lt;/style&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>36</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/heating-up</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>What You Measure</title><link>https://thedailywtf.com/articles/what-you-measure</link><category>Feature Articles</category><pubDate>Wed, 02 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/what-you-measure</guid><description>&lt;p&gt;&lt;strong&gt;Rachel&lt;/strong&gt; joined a new team which was proudly &amp;#34;metrics driven&amp;#34;. When she first met with her boss, Zane, he explained his thinking.&lt;/p&gt;
&lt;p&gt;&amp;#34;We need to be data-driven to make good decisions, right? We&amp;#39;re a manufacturing company. We make widgets. At the end of the day, we need to make the most widgets for the lowest cost of goods sold. So we track that, and that feeds into every decision.&amp;#34;&lt;/p&gt;
&lt;p&gt;The team oversaw an automated production line, which meant the software was a mix of robotics, embedded firmware, high-level web based monitoring tools, and thickets of dreaded PLC code. And because you can&amp;#39;t build an entire factory for test purposes, they only way they could test real-world scales with real-world data was to roll changes out to production. They could simulate, they could run tests on subsets of the system, but a change in the production line software couldn&amp;#39;t truly be validated until it rolled out into the real world.&lt;/p&gt;
&lt;p&gt;Rachel&amp;#39;s first task on the new team involved making some changes to their metrics dashboard. It was viewed as a good way to get her feet wet with the new team. As it turned out, the metrics dashboard was a Google Sheet, with a complex series of formulas that involved multi-level &lt;code&gt;INDEX&lt;/code&gt; functions- essentially querying the spreadsheets like they were a database. Why not use an actual database? Oh, they did — six actually — but the company obeyed Remy&amp;#39;s Law of Requirements Gathering: &amp;#34;no matter what the requirements the users ask for, what they really wanted was Excel&amp;#34;. The database data was pulled into the spreadsheet for reporting.&lt;/p&gt;
&lt;p&gt;Now, a complicated sheet pulling in data from not one, but six different databases, they must have a pretty complex model to explain how changes to their software would impact productivity. And since they needed to model the software to make predictions about how it&amp;#39;d behave in production, that model must be extremely useful.&lt;/p&gt;
&lt;p&gt;Of course it wasn&amp;#39;t. The only metrics they tracked were output metrics, variations on &amp;#34;widgets produced per unit time&amp;#34;. There were some performance metrics, so you could maybe potentially identify &amp;#34;oh, our overall throughput dropped because unit 5 became a bottleneck and started taking 1.5 extra seconds per widget&amp;#34;, but nothing that actually helped you understand how the complex system made decisions. Or even &lt;em&gt;why&lt;/em&gt; unit 5 was taking longer.&lt;/p&gt;
&lt;p&gt;For example, there was an automated quality control scanner. It examined widgets as they came off the line, and rejected defective ones based on a computer vision algorithm. Did that subsystem record why it rejected a widget? No, it did not. The CV model was able to tag widgets with a defect category based on what it saw, but that information didn&amp;#39;t get recorded anywhere. In fact, it didn&amp;#39;t even record how &lt;em&gt;many&lt;/em&gt; widgets got rejected. The only way to know was to have an operator on the assembly line count widgets in the bin manually. Since that ate up a bunch of an operator&amp;#39;s time, it never happened unless the developers begged for it. And since the operator still couldn&amp;#39;t answer the question &amp;#34;why was this widget rejected&amp;#34;, it wasn&amp;#39;t all that useful anyway.&lt;/p&gt;
&lt;p&gt;Every change to the software was scored against the overall output metrics. This meant that when Rachel was ready to push out her first software change, something that would &lt;em&gt;record how many widgets were rejected and why&lt;/em&gt;, whether or not it could be deployed was dependent on seeing the change improve, or at least not regress, the widgets-over-time scores. But the widgets-over-time were a noisy metric; it varied based on which operators were working any given shift, or based on supply chain constraints. Or sometimes, based on when one of the machines was last calibrated- theoretically something that happened on a set schedule, but really was up to the operators. This meant the first three times Rachel rolled her code out for a test run, the metrics regressed. Nothing she changed should have impacted the metrics, but the metrics regressed due to environmental issues.&lt;/p&gt;
&lt;p&gt;This meant making a simple change could take weeks, because you could only do final validation on the real system, which means you had to mark off a block of time for a test run, you could only run a handful of tests a day, and if metrics regressed you had to account for that before you could release the software for actual production use.&lt;/p&gt;
&lt;p&gt;Over the first few months, Rachel added instrumentation to the code. Anything along the way to generating an output widget, she recorded. The hope was that once they had enough data, they could build a useful model of the system. Unfortunately, Zane had other ideas.&lt;/p&gt;
&lt;p&gt;&amp;#34;So, you haven&amp;#39;t improved our metrics,&amp;#34; Zane said. &amp;#34;Which, I remind you, we&amp;#39;re a metrics driven organization. Every change needs to improve our metrics.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Sure, but I&amp;#39;m gathering more data so we have a better idea of what makes our metrics tick. We don&amp;#39;t know why our system does some of the things it does, because we don&amp;#39;t record any logging about the decisions it makes.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Right, but we already gather the key metrics.&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;But you don&amp;#39;t gather the data that tells you why those metrics are what they are!&amp;#34;&lt;/p&gt;
&lt;p&gt;&amp;#34;Sure,&amp;#34; Zane said. &amp;#34;But those aren&amp;#39;t our key metrics.&amp;#34;&lt;/p&gt;
&lt;p&gt;That, unfortunately for Rachel, was where things landed. Understanding their complex system was a low priority. Pushing top-level metrics without understanding what fed into them, that was the priority. That didn&amp;#39;t mean Rachel was powerless: any time she made a change that she thought might help the top level metrics, she also made sure to add instrumentation that explained how that change behaved. It was the compromise that kept Zane happy: she released features that impacted the top-level metrics, but she also made the system more observable.&lt;/p&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;BuildMaster&lt;/a&gt; allows you to create a self-service release management platform that allows different teams to manage their applications. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Explore how!&lt;/a&gt; 
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>27</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/what-you-measure</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Representative Line: So Much Room</title><link>https://thedailywtf.com/articles/so-much-room</link><category>Representative Line</category><pubDate>Tue, 01 Sep 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/so-much-room</guid><description>&lt;p&gt;Today&amp;#39;s representative comment ran out of room.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-java"&gt;&lt;span class="hljs-type"&gt;int&lt;/span&gt; &lt;span class="hljs-variable"&gt;maxLen&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; getColumnSize(session, &lt;span class="hljs-string"&gt;&amp;#34;audit&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;text_value1&amp;#34;&lt;/span&gt;) - &lt;span class="hljs-number"&gt;16&lt;/span&gt;; &lt;span class="hljs-comment"&gt;// Leave some room for&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;No, it isn&amp;#39;t continued on the next line and just got trimmed out, except perhaps by a careless merge. This is the entire comment.&lt;/p&gt;
&lt;p&gt;Clearly, written by David Chase, the creator of &amp;#34;The Sopranos&amp;#34;.&lt;/p&gt;
&lt;p&gt;There are so many things we might be leaving room for. We could leave some room for dessert. Leave some room for activities. Leave some room for the holy spirit. Leave some room for improvisation.&lt;/p&gt;
&lt;!-- Easy Reader Version: Leave some room for comments --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>22</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/so-much-room</wfw:comment></item><item><dc:creator>Ellis Morning</dc:creator><title>Tales from the World Cup</title><link>https://thedailywtf.com/articles/tales-from-the-world-cup</link><category>Feature Articles</category><pubDate>Mon, 31 Aug 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/tales-from-the-world-cup</guid><description>&lt;p&gt;All I can say in response to our &lt;b&gt;anonymous&lt;/b&gt; submitter&amp;#39;s story is, ALMOST?!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;With the World Cup being hosted in North America this year, I remembered this story that happened back in 2014. At the time I was working in Brazil, for a company that builds software systems for public services. And, with the World Cup being hosted there, in came the opportunity for local agencies to invest in modernization, with pretty much a blank check to get new services, so long as it was deployed before the end of the World Cup. And so the sales people did what they did best, and went around trying to upsell whoever would be willing to buy — no matter our actual capacity for developing the things.&lt;/p&gt;

&lt;p&gt;So it was that I was pulled into this new fancy digital system for the police force of a state capital. However, we had only about 4 engineers available, and what they sold was a project estimated for a team of 20, to be delivered in 3 months, with no room for delay. And it wasn&amp;#39;t just our core C&amp;amp;D product, but this massive thing with customized public-facing websites, live tracking of the position of different police cars delivered to a tablet in each car, automated reporting, etc.&lt;/p&gt;

&lt;p style="float:right; padding-left:10px; padding-bottom:10px;"&gt;&lt;a title="Danilo Borges/copa2014.gov.br  LicenÃ§a Creative Commons AtribuiÃ§Ã£o 3.0 Brasil, CC BY 3.0 &amp;lt;https://creativecommons.org/licenses/by/3.0&amp;gt;, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Germany_and_Argentina_face_off_in_the_final_of_the_World_Cup_2014_-2014-07-13_(5).jpg"&gt;&lt;img itemprop="image" width="300" alt="Germany and Argentina face off in the final of the World Cup 2014 -2014-07-13 (5)" src="https://upload.wikimedia.org/wikipedia/commons/thumb/8/89/Germany_and_Argentina_face_off_in_the_final_of_the_World_Cup_2014_-2014-07-13_%285%29.jpg/330px-Germany_and_Argentina_face_off_in_the_final_of_the_World_Cup_2014_-2014-07-13_%285%29.jpg?utm_source=commons.wikimedia.org&amp;amp;utm_campaign=index&amp;amp;utm_content=thumbnail"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;First thing: We received a pile of 24 resumes, and were told to choose 16 of those. Maybe 3 were acceptable, but we had to waste 1 month hiring and onboarding 13 other people who were worse than useless. Classic man-month problem. We eventually had to tell management that nothing would be delivered this way, so they did the very best next thing: fly us to this other city, so we could work embedded there, in full crunch mode for the delivery. We pretty much worked 12+ hours a day, 7 days a week, for those next 2 weeks.&lt;/p&gt;

&lt;p&gt;Another situation: they wanted this system where people could take a photo of an incident in progress, and submit via this app + website, to be verified by an operator in real-time. We nicknamed it the &amp;#34;dick-pic encyclopedia.&amp;#34; Even worse, we only had the budget to run a single server, so this thing receiving public traffic would live in the same system that was tracking police car locations. Luckily they were convinced it was a bad idea so it was only ever online for a short period of time.&lt;/p&gt;

&lt;p&gt;Next, was the police car tracking. This was done by a tablet installed in each car, which would be sending and receiving location information. But, 1 week before our deadline, we were hitting a serious bug: everything was working when we ran the tests ourselves, but the cops would report very weird bugs when testing it in the field. So we asked to do some field debugging, and I went on a ride-along. Things were working pretty much fine everywhere, so I asked to be taken to where he remembered seeing the tablets fail—to which the policeman just decides to drive off straight into one of the favelas around the city. I guess I can cross out &amp;#34;doing debugging in a police car passenger seat in a notoriously dangerous neighborhood&amp;#34; off my bucket list. Root cause: turns out cellphone connections would be pretty spotty in those areas, which we weren&amp;#39;t handling properly.&lt;/p&gt;

&lt;p&gt;Either way, we delivered something on time that was severely below spec, and very much over-budget. Company tried to squirm out of paying overtime (was told that we would gain &amp;#34;prestige&amp;#34; by doing those extra hours), but I put my foot down and left that job shortly after. Last I heard they actually got sued for this and a bunch of similar projects, and almost went under.&lt;/p&gt;
&lt;/blockquote&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;BuildMaster&lt;/a&gt; allows you to create a self-service release management platform that allows different teams to manage their applications. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Explore how!&lt;/a&gt; 
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>7</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/tales-from-the-world-cup</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Hello, New Mexico!</title><link>https://thedailywtf.com/articles/hello-new-mexico</link><category>Error'd</category><pubDate>Fri, 28 Aug 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/hello-new-mexico</guid><description>&lt;p&gt;
&lt;strong&gt;Peter G.&lt;/strong&gt; shared with us yet another ordering bungled example of.
&amp;#34;Should really say &amp;#34;please engage in an Easter egg hunt
to find your language&amp;#34;.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#3ccdf44218264528b28550518f7d6aea"&gt;&lt;img itemprop="image" border="0" alt="3ccdf44218264528b28550518f7d6aea" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/27/3ccdf44218264528b28550518f7d6aea.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Google can&amp;#39;t count&amp;#34; claimed 
&lt;strong&gt;Peter S.&lt;/strong&gt;.  It adds up.
&amp;#34;Yet another proof that 0=1, this time from Google.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#2d284d0f696d48669a9c59251ecf9bc0"&gt;&lt;img itemprop="image" border="0" alt="2d284d0f696d48669a9c59251ecf9bc0" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/27/2d284d0f696d48669a9c59251ecf9bc0.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;



&lt;p&gt;&amp;#34;Thanks, Microsoft&amp;#34; groused 
&lt;strong&gt;Ivan&lt;/strong&gt;
&amp;#34;Ever since Microsoft ate university e-mail services worldwide and became
responsible for major free software mailing lists, quality of service
has been steadily dropping. In order to report delivery problems
to Outlook, you need a Microsoft account. You&amp;#39;re prevented from
creating it at first because of &amp;#34;suspicious activity&amp;#34;. Once you&amp;#39;re
in, the contact address is pre-filled for you with an
invalid email. Once you fix that in the web developer
toolbar, fuck you anyway! I think the form isn&amp;#39;t actually
expected to work; the fact that the request was submitted
is an error. The only thing missing from the experience
is the &amp;#34;beware of the leopard&amp;#34; sign.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#ae9ba09cc9474a2f89b8358201b0419a"&gt;&lt;img itemprop="image" border="0" alt="ae9ba09cc9474a2f89b8358201b0419a" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/27/ae9ba09cc9474a2f89b8358201b0419a.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Mango Math&amp;#34; needs a bit of money math for the rest of the world to understand.
&lt;strong&gt;Michael R.&lt;/strong&gt; muttered 
&amp;#34;I will buy it by the slice then.&amp;#34; The joke here is on the tip of my tongue.  Explainer: the new pence is one hundredth of the decimal pound. No shillings no more, decreps! At that ratio, 3p per slice of cheesecake would indeed be far less dear than four pounds for the whole thing, barring translucent slices. Alas, the reality is simply the boring fact that the price is 3p per gram.  Not as funny but I&amp;#39;m chuckling imagining Michael&amp;#39;s transparent serving of diet cheesecake. I&amp;#39;ll leave it up to you to decide if a gram really counts as an &amp;#34;item&amp;#34;. 
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#bd6d8a538f7a45b2a81f8b52d425b180"&gt;&lt;img itemprop="image" border="0" alt="bd6d8a538f7a45b2a81f8b52d425b180" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/27/bd6d8a538f7a45b2a81f8b52d425b180.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;
&lt;strong&gt;Clint&lt;/strong&gt; clucked 
&amp;#34;Got this email from Bigbadtoystore. Lots of links available for
preorder!&amp;#34; I think the talented website builders behind the New Mexico DOT have been busy.
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#d7efd5aabe754173a54fccb84c60b942"&gt;&lt;img itemprop="image" border="0" alt="d7efd5aabe754173a54fccb84c60b942" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/27/d7efd5aabe754173a54fccb84c60b942.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;div&gt;
	[Advertisement] Picking up &lt;b&gt;NuGet&lt;/b&gt; is easy. Getting good at it takes time. &lt;a href="https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&amp;amp;utm_medium=Footerad&amp;amp;utm_campaign=nuget"&gt;Download our guide to learn the best practice of NuGet for the Enterprise.&lt;/a&gt;

&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>26</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/hello-new-mexico</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: The Big Family</title><link>https://thedailywtf.com/articles/the-big-family</link><category>CodeSOD</category><pubDate>Thu, 27 Aug 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/the-big-family</guid><description>&lt;p&gt;Some time ago, &lt;strong&gt;Charles&lt;/strong&gt; shared with us &lt;a href="https://thedailywtf.com/articles/contact-us"&gt;some awful PHP&lt;/a&gt;, aka the most common sort. Today&amp;#39;s code sample is maybe a little too big to sum up, but I&amp;#39;ll let Charles take a crack at it.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It&amp;#39;s so bad that even analyzing and laughing at it feels impossible. But it’s so bad, I couldn’t not share it.&lt;/p&gt;
&lt;p&gt;I’m the only one handling all the IT-related tasks at my company, and I don’t have anyone here to vent or laugh about this kind of thing with. So, I figured, why not share it here? I’m hoping it’ll provide at least a little bit of catharsis or some dark humor.&lt;/p&gt;
&lt;p&gt;To make sure the confidentiality of the codebase was respected, I took the liberty of generalizing it. You might notice some inconsistencies, but that’s just me trying to keep things neutral while protecting the original structure and functionality. Apologies if it looks a bit patchy – the goal was to avoid revealing any specific details or sensitive code.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The whole block is north of 400 lines, and it&amp;#39;s doing a &lt;em&gt;lot&lt;/em&gt;. Or well, maybe it&amp;#39;s not, as you&amp;#39;ll see.&lt;/p&gt;
&lt;p&gt;Let&amp;#39;s star with the outermost layer.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;&lt;span class="hljs-variable"&gt;$resm_data&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$data_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetchData&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;group=&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$item_id&lt;/span&gt;);
&lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$resm_data&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$value&lt;/span&gt;) {
&lt;span class="hljs-comment"&gt;// rest of the code here&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;We fetch data from a data source, presumably a database, passing our condition as a string, which reeks of probable SQL injection, but I don&amp;#39;t know what library they&amp;#39;re using. I also note they&amp;#39;re using the key/value style of array iteration, but never actually check the key.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;    &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$value&lt;/span&gt;-&amp;gt;option_id;
    &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$detail_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetch&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt;);
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;) {
        &lt;span class="hljs-variable"&gt;$label&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;label&lt;span class="hljs-subst"&gt;$lang&lt;/span&gt;&amp;#34;&lt;/span&gt;};
        &lt;span class="hljs-variable"&gt;$description&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;description&lt;span class="hljs-subst"&gt;$lang&lt;/span&gt;&amp;#34;&lt;/span&gt;};
        &lt;span class="hljs-variable"&gt;$category&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;category;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nice little bit of &amp;#34;meta&amp;#34; programming to get their localization working, it&amp;#39;ll fetch &lt;code&gt;labelen&lt;/code&gt; or &lt;code&gt;labelde&lt;/code&gt; as needed. Definitely not a horrible, dangerous way to solve that problem.&lt;/p&gt;
&lt;p&gt;We use that again to get our currency figured out. That lets us do number formatting. So much number formatting code.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$category&lt;/span&gt; == &lt;span class="hljs-number"&gt;0&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;child_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; =
                &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34; - &amp;#34;&lt;/span&gt; .
                &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$category&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$category&lt;/span&gt; == &lt;span class="hljs-number"&gt;2&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;child_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$category&lt;/span&gt; == &lt;span class="hljs-number"&gt;4&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;500&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (
            &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;} == &lt;span class="hljs-number"&gt;0&lt;/span&gt; &lt;span class="hljs-keyword"&gt;and&lt;/span&gt;
            &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;child_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;} == &lt;span class="hljs-number"&gt;0&lt;/span&gt;
        ) {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;200&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;What is the &lt;code&gt;$mot&lt;/code&gt; array? Why am I jumping to seemingly random locations in that array? Clearly it contains some headers for our output.&lt;/p&gt;
&lt;p&gt;Anyway, there&amp;#39;s plenty of HTML string munging happening too, don&amp;#39;t you worry.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$location&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$quantity_block&lt;/span&gt; =
                &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;quantity-container&amp;#34;&amp;gt;
                    &amp;lt;input type=&amp;#34;text&amp;#34; value=&amp;#34;1&amp;#34; id=&amp;#34;quantity-&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; class=&amp;#34;qty-control&amp;#34; name=&amp;#34;quantity&amp;#34; min=&amp;#34;1&amp;#34; max=&amp;#34;1&amp;#34;&amp;gt;
                    &amp;lt;div class=&amp;#34;increase button&amp;#34;&amp;gt;+&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;#34;decrease button&amp;#34;&amp;gt;-&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$quantity&lt;/span&gt; = &lt;span class="hljs-number"&gt;1&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
            &lt;span class="hljs-variable"&gt;$quantity_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$quantity&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;;
        }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then there&amp;#39;s this little treat for parsing the time stored in our database: &lt;code&gt;$time_data = json_decode($resm_details-&amp;gt;time_data);&lt;/code&gt; That tells me they&amp;#39;re storing date times as strings, so that&amp;#39;s fun.&lt;/p&gt;
&lt;p&gt;There are also a couple more bon mots as they build a drop down list:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;            &lt;span class="hljs-variable"&gt;$departure_select&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;-1&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;300&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$arrival_select&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;-1&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;301&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then there&amp;#39;s &lt;em&gt;this&lt;/em&gt; monstrosity:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;        &lt;span class="hljs-comment"&gt;// Add the main option to the template&lt;/span&gt;
        &lt;span class="hljs-variable"&gt;$TEMPLATE&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;SET_BLOCK_VARIABLES&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;Block_OPTIONS&amp;#34;&lt;/span&gt;, [
            &lt;span class="hljs-string"&gt;&amp;#34;ID&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$quantity&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;LABEL_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$label_class&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;ACTION_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$action_class&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;LABEL&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$label&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;DESCRIPTION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$description&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$quantity_block&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;COST_INFO&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;HOST_COST_DISPLAY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$host_cost_display&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;CHILD_COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;LOCATION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$location&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;CATEGORY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$category&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;HOST_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$host_class&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$extra&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;HOST_EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$host_extra&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;TIME_CHECKED&amp;#34;&lt;/span&gt; =&amp;gt; (&lt;span class="hljs-variable"&gt;$has_times&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) ? &lt;span class="hljs-string"&gt;&amp;#39;selected=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; checked=&amp;#34;true&amp;#34;&amp;#39;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;TIME_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$time_block&lt;/span&gt;
        ]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;All the nonsense that we concatenate together above gets shoved into some sort of template. And after that, that&amp;#39;s where the good stuff starts. Because guess what? We have to do the same thing for child items.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;        &lt;span class="hljs-variable"&gt;$resm_children_data&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$data_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetchData&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;parent=&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt;);
        &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$resm_children_data&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$child_key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_value&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$child_value&lt;/span&gt;-&amp;gt;option_id;
            &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$detail_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetch&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;That&amp;#39;s right, it&amp;#39;s the same block of code, not quite copy/pasted, since they needed to put the word &lt;code&gt;child&lt;/code&gt; in everything.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;                &lt;span class="hljs-comment"&gt;// Add the child option to the template&lt;/span&gt;
                &lt;span class="hljs-variable"&gt;$TEMPLATE&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;SET_BLOCK_VARIABLES&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;Block_OPTIONS.Block_OPTIONS_CHILD&amp;#34;&lt;/span&gt;, [
                    &lt;span class="hljs-string"&gt;&amp;#34;ID&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_quantity&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;LABEL_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_label_class&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;ACTION_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_action_class&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;LABEL&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_label&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;DESCRIPTION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_description&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_quantity_block&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;COST_INFO&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_cost_info&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;HOST_COST_DISPLAY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_host_cost_display&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;CHILD_COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_extra_cost&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;LOCATION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_location&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;CATEGORY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_category&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;HOST_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_host_class&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_extra&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;HOST_EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_host_extra&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;TIME_CHECKED&amp;#34;&lt;/span&gt; =&amp;gt; (&lt;span class="hljs-variable"&gt;$child_has_times&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) ? &lt;span class="hljs-string"&gt;&amp;#39;selected=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; checked=&amp;#34;true&amp;#34;&amp;#39;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;TIME_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_time_block&lt;/span&gt;
                ]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And now, if you liked the child record, guess what? Those children have got siblings. What can I say, it&amp;#39;s a big family.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;                &lt;span class="hljs-variable"&gt;$resm_sibling_data&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$data_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetchData&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;parent=&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$parent_option_id&lt;/span&gt;);
                &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$resm_sibling_data&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$sibling_key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_value&lt;/span&gt;) {
                    &lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$sibling_value&lt;/span&gt;-&amp;gt;option_id;
                    &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$detail_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetch&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt;);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And that means, yes, we also use that template thing again:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;                        &lt;span class="hljs-comment"&gt;// Add the sibling option to the template&lt;/span&gt;
                        &lt;span class="hljs-variable"&gt;$TEMPLATE&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;SET_BLOCK_VARIABLES&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;Block_OPTIONS.Block_OPTIONS_CHILD&amp;#34;&lt;/span&gt;, [
                            &lt;span class="hljs-string"&gt;&amp;#34;ID&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_quantity&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;LABEL_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_label_class&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;ACTION_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_action_class&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;LABEL&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_label&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;DESCRIPTION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_description&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_quantity_block&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;COST_INFO&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_cost_info&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;HOST_COST_DISPLAY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_host_cost_display&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;SIBLING_COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_extra_cost&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;LOCATION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_location&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;CATEGORY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_category&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;HOST_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_host_class&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_extra&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;HOST_EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_host_extra&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;TIME_CHECKED&amp;#34;&lt;/span&gt; =&amp;gt; (&lt;span class="hljs-variable"&gt;$sibling_has_times&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) ? &lt;span class="hljs-string"&gt;&amp;#39;selected=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; checked=&amp;#34;true&amp;#34;&amp;#39;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;TIME_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_time_block&lt;/span&gt;
                        ]);
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Someday, I hope the person who wrote this learn about methods and function calls. Maybe they could write their own one day.&lt;/p&gt;
&lt;p&gt;In any case, here&amp;#39;s the whole thing:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-php"&gt;&lt;span class="hljs-variable"&gt;$resm_data&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$data_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetchData&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;group=&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$item_id&lt;/span&gt;);
&lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$resm_data&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$value&lt;/span&gt;) {
    &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$value&lt;/span&gt;-&amp;gt;option_id;
    &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$detail_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetch&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt;);
    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;) {
        &lt;span class="hljs-variable"&gt;$label&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;label&lt;span class="hljs-subst"&gt;$lang&lt;/span&gt;&amp;#34;&lt;/span&gt;};
        &lt;span class="hljs-variable"&gt;$description&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;description&lt;span class="hljs-subst"&gt;$lang&lt;/span&gt;&amp;#34;&lt;/span&gt;};
        &lt;span class="hljs-variable"&gt;$category&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;category;

        &lt;span class="hljs-comment"&gt;// Process cost based on category&lt;/span&gt;
        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$category&lt;/span&gt; == &lt;span class="hljs-number"&gt;0&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;child_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; =
                &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34; - &amp;#34;&lt;/span&gt; .
                &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$category&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$category&lt;/span&gt; == &lt;span class="hljs-number"&gt;2&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;child_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$category&lt;/span&gt; == &lt;span class="hljs-number"&gt;4&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;500&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (
            &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;} == &lt;span class="hljs-number"&gt;0&lt;/span&gt; &lt;span class="hljs-keyword"&gt;and&lt;/span&gt;
            &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;child_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;} == &lt;span class="hljs-number"&gt;0&lt;/span&gt;
        ) {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
            &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;200&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
        }

        &lt;span class="hljs-variable"&gt;$location&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;location;
        &lt;span class="hljs-variable"&gt;$label_class&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$location&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt; ? &lt;span class="hljs-string"&gt;&amp;#34;has-quantity&amp;#34;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#34;no-quantity&amp;#34;&lt;/span&gt;;
        &lt;span class="hljs-variable"&gt;$action_class&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$location&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt; ? &lt;span class="hljs-string"&gt;&amp;#34;active-with-quantity&amp;#34;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#34;active-no-quantity&amp;#34;&lt;/span&gt;;
        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$location&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$quantity_block&lt;/span&gt; =
                &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;quantity-container&amp;#34;&amp;gt;
                    &amp;lt;input type=&amp;#34;text&amp;#34; value=&amp;#34;1&amp;#34; id=&amp;#34;quantity-&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; class=&amp;#34;qty-control&amp;#34; name=&amp;#34;quantity&amp;#34; min=&amp;#34;1&amp;#34; max=&amp;#34;1&amp;#34;&amp;gt;
                    &amp;lt;div class=&amp;#34;increase button&amp;#34;&amp;gt;+&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;#34;decrease button&amp;#34;&amp;gt;-&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$quantity&lt;/span&gt; = &lt;span class="hljs-number"&gt;1&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
            &lt;span class="hljs-variable"&gt;$quantity_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$quantity&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;;
        }

        &lt;span class="hljs-variable"&gt;$has_times&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;has_times;

        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$has_times&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$time_counter&lt;/span&gt;++;
            &lt;span class="hljs-variable"&gt;$time_data&lt;/span&gt; = &lt;span class="hljs-title function_ invoke__"&gt;json_decode&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;time_data);

            &lt;span class="hljs-variable"&gt;$departure_select&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;-1&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;300&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$arrival_select&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;-1&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;301&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;

            &lt;span class="hljs-variable"&gt;$departures&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$time_data&lt;/span&gt;-&amp;gt;departures;
            &lt;span class="hljs-variable"&gt;$arrivals&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$time_data&lt;/span&gt;-&amp;gt;arrivals;

            &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$departures&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$dep_key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$departure&lt;/span&gt;) {
                &lt;span class="hljs-variable"&gt;$departure_select&lt;/span&gt; .= &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$dep_key&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$departure&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
            }

            &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$arrivals&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$arr_key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$arrival&lt;/span&gt;) {
                &lt;span class="hljs-variable"&gt;$arrival_select&lt;/span&gt; .= &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$arr_key&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$arrival&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
            }

            &lt;span class="hljs-variable"&gt;$departure_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;col-half time-select-&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; style=&amp;#34;padding-right: 0;&amp;#34;&amp;gt;
                &amp;lt;select class=&amp;#34;form-control time-departure&amp;#34; style=&amp;#34;text-align: center;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$departure_select&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/select&amp;gt;
                &amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;

            &lt;span class="hljs-variable"&gt;$arrival_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;col-half time-select-&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; style=&amp;#34;padding-left: 0;&amp;#34;&amp;gt;
                &amp;lt;select class=&amp;#34;form-control time-arrival&amp;#34; style=&amp;#34;text-align: center;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$arrival_select&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/select&amp;gt;
                &amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;

            &lt;span class="hljs-variable"&gt;$time_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;row time-container&amp;#34;&amp;gt;
                &amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$departure_block&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$arrival_block&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;
            &amp;lt;/div&amp;gt;&amp;lt;small class=&amp;#34;error-message time-error&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;302&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/small&amp;gt;&amp;#39;&lt;/span&gt;;
        } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
            &lt;span class="hljs-variable"&gt;$time_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
        }

        &lt;span class="hljs-variable"&gt;$host_cost_display&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
        &lt;span class="hljs-variable"&gt;$extra&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;extra;
        &lt;span class="hljs-variable"&gt;$host_extra&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;host_extra;
        &lt;span class="hljs-variable"&gt;$host_class&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;

        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$extra&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$extra_cost_1&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34;_1&amp;#34;&lt;/span&gt;};
            &lt;span class="hljs-variable"&gt;$extra_cost_2&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34;_2&amp;#34;&lt;/span&gt;};

            &lt;span class="hljs-variable"&gt;$default_extra&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$host_price&lt;/span&gt; == &lt;span class="hljs-number"&gt;0&lt;/span&gt; ? &lt;span class="hljs-variable"&gt;$extra_cost_2&lt;/span&gt; : &lt;span class="hljs-variable"&gt;$extra_cost_1&lt;/span&gt;;
            &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39; : +&amp;lt;span class=&amp;#34;extra-cost&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$default_extra&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) .
                &lt;span class="hljs-string"&gt;&amp;#34;&amp;lt;/span&amp;gt;&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34; - &amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39; : +&amp;lt;span class=&amp;#34;child-cost&amp;#34;&amp;gt;0.00&amp;lt;/span&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;

            &lt;span class="hljs-variable"&gt;$host_class&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34; extra-option&amp;#34;&lt;/span&gt;;
        }
        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$host_extra&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$host_cost_display&lt;/span&gt; =
                &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;span class=&amp;#34;host-cost&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;500&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39; : +&amp;lt;span class=&amp;#34;host-price&amp;#34;&amp;gt;0.00&amp;lt;/span&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt; .
                &lt;span class="hljs-string"&gt;&amp;#34;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;#34;&lt;/span&gt;;
        }

        &lt;span class="hljs-comment"&gt;// Add the main option to the template&lt;/span&gt;
        &lt;span class="hljs-variable"&gt;$TEMPLATE&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;SET_BLOCK_VARIABLES&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;Block_OPTIONS&amp;#34;&lt;/span&gt;, [
            &lt;span class="hljs-string"&gt;&amp;#34;ID&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$quantity&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;LABEL_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$label_class&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;ACTION_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$action_class&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;LABEL&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$label&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;DESCRIPTION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$description&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$quantity_block&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;COST_INFO&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$cost_info&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;HOST_COST_DISPLAY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$host_cost_display&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$cost&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;CHILD_COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;LOCATION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$location&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;CATEGORY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$category&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;HOST_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$host_class&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$extra&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;HOST_EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$host_extra&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;TIME_CHECKED&amp;#34;&lt;/span&gt; =&amp;gt; (&lt;span class="hljs-variable"&gt;$has_times&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) ? &lt;span class="hljs-string"&gt;&amp;#39;selected=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; checked=&amp;#34;true&amp;#34;&amp;#39;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
            &lt;span class="hljs-string"&gt;&amp;#34;TIME_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$time_block&lt;/span&gt;
        ]);

        &lt;span class="hljs-variable"&gt;$resm_children_data&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$data_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetchData&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;parent=&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$option_id&lt;/span&gt;);
        &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$resm_children_data&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$child_key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_value&lt;/span&gt;) {
            &lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$child_value&lt;/span&gt;-&amp;gt;option_id;
            &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$detail_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetch&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt;);
            &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;) {
                &lt;span class="hljs-variable"&gt;$child_label&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;label&lt;span class="hljs-subst"&gt;$lang&lt;/span&gt;&amp;#34;&lt;/span&gt;};
                &lt;span class="hljs-variable"&gt;$child_description&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;description&lt;span class="hljs-subst"&gt;$lang&lt;/span&gt;&amp;#34;&lt;/span&gt;};
                &lt;span class="hljs-variable"&gt;$child_category&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;category;

                &lt;span class="hljs-comment"&gt;// Process cost for child category&lt;/span&gt;
                &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$child_category&lt;/span&gt; == &lt;span class="hljs-number"&gt;0&lt;/span&gt;) {
                    &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                    &lt;span class="hljs-variable"&gt;$child_extra_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;child_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                    &lt;span class="hljs-variable"&gt;$child_cost_info&lt;/span&gt; =
                        &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34; - &amp;#34;&lt;/span&gt; .
                        &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_extra_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
                } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$child_category&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
                    &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                    &lt;span class="hljs-variable"&gt;$child_extra_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                    &lt;span class="hljs-variable"&gt;$child_cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
                } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$child_category&lt;/span&gt; == &lt;span class="hljs-number"&gt;2&lt;/span&gt;) {
                    &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                    &lt;span class="hljs-variable"&gt;$child_extra_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;child_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                    &lt;span class="hljs-variable"&gt;$child_cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_extra_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
                } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$child_category&lt;/span&gt; == &lt;span class="hljs-number"&gt;4&lt;/span&gt;) {
                    &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                    &lt;span class="hljs-variable"&gt;$child_extra_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                    &lt;span class="hljs-variable"&gt;$child_cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;500&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
                } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (
                    &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;} == &lt;span class="hljs-number"&gt;0&lt;/span&gt; &lt;span class="hljs-keyword"&gt;and&lt;/span&gt;
                    &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;child_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;} == &lt;span class="hljs-number"&gt;0&lt;/span&gt;
                ) {
                    &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                    &lt;span class="hljs-variable"&gt;$child_extra_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                    &lt;span class="hljs-variable"&gt;$child_cost_info&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
                } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
                    &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                    &lt;span class="hljs-variable"&gt;$child_extra_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                    &lt;span class="hljs-variable"&gt;$child_cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;200&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
                }

                &lt;span class="hljs-variable"&gt;$child_location&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;location;
                &lt;span class="hljs-variable"&gt;$child_label_class&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$child_location&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt; ? &lt;span class="hljs-string"&gt;&amp;#34;has-quantity&amp;#34;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#34;no-quantity&amp;#34;&lt;/span&gt;;
                &lt;span class="hljs-variable"&gt;$child_action_class&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$child_location&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt; ? &lt;span class="hljs-string"&gt;&amp;#34;active-with-quantity&amp;#34;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#34;active-no-quantity&amp;#34;&lt;/span&gt;;
                &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$child_location&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
                    &lt;span class="hljs-variable"&gt;$child_quantity_block&lt;/span&gt; =
                        &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;quantity-container&amp;#34;&amp;gt;
                    &amp;lt;input type=&amp;#34;text&amp;#34; value=&amp;#34;1&amp;#34; id=&amp;#34;child-quantity-&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; class=&amp;#34;qty-control&amp;#34; name=&amp;#34;quantity&amp;#34; min=&amp;#34;1&amp;#34; max=&amp;#34;1&amp;#34;&amp;gt;
                    &amp;lt;div class=&amp;#34;increase button&amp;#34;&amp;gt;+&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;#34;decrease button&amp;#34;&amp;gt;-&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;
                    &lt;span class="hljs-variable"&gt;$child_quantity&lt;/span&gt; = &lt;span class="hljs-number"&gt;1&lt;/span&gt;;
                } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
                    &lt;span class="hljs-variable"&gt;$child_quantity_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
                    &lt;span class="hljs-variable"&gt;$child_quantity&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;;
                }

                &lt;span class="hljs-variable"&gt;$child_has_times&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;has_times;

                &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$child_has_times&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
                    &lt;span class="hljs-variable"&gt;$child_time_counter&lt;/span&gt;++;
                    &lt;span class="hljs-variable"&gt;$child_time_data&lt;/span&gt; = &lt;span class="hljs-title function_ invoke__"&gt;json_decode&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;time_data);

                    &lt;span class="hljs-variable"&gt;$child_departure_select&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;-1&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;300&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
                    &lt;span class="hljs-variable"&gt;$child_arrival_select&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;-1&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;301&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;

                    &lt;span class="hljs-variable"&gt;$child_departures&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$child_time_data&lt;/span&gt;-&amp;gt;departures;
                    &lt;span class="hljs-variable"&gt;$child_arrivals&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$child_time_data&lt;/span&gt;-&amp;gt;arrivals;

                    &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$child_departures&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$child_dep_key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_departure&lt;/span&gt;) {
                        &lt;span class="hljs-variable"&gt;$child_departure_select&lt;/span&gt; .= &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_dep_key&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_departure&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
                    }

                    &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$child_arrivals&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$child_arr_key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_arrival&lt;/span&gt;) {
                        &lt;span class="hljs-variable"&gt;$child_arrival_select&lt;/span&gt; .= &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_arr_key&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_arrival&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
                    }

                    &lt;span class="hljs-variable"&gt;$child_departure_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;col-half time-select-&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; style=&amp;#34;padding-right: 0;&amp;#34;&amp;gt;
                &amp;lt;select class=&amp;#34;form-control time-departure&amp;#34; style=&amp;#34;text-align: center;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_departure_select&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/select&amp;gt;
                &amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;

                    &lt;span class="hljs-variable"&gt;$child_arrival_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;col-half time-select-&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; style=&amp;#34;padding-left: 0;&amp;#34;&amp;gt;
                &amp;lt;select class=&amp;#34;form-control time-arrival&amp;#34; style=&amp;#34;text-align: center;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_arrival_select&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/select&amp;gt;
                &amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;

                    &lt;span class="hljs-variable"&gt;$child_time_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;row time-container&amp;#34;&amp;gt;
                &amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_departure_block&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_arrival_block&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;
            &amp;lt;/div&amp;gt;&amp;lt;small class=&amp;#34;error-message time-error&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;302&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/small&amp;gt;&amp;#39;&lt;/span&gt;;
                } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
                    &lt;span class="hljs-variable"&gt;$child_time_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
                }

                &lt;span class="hljs-variable"&gt;$child_host_cost_display&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
                &lt;span class="hljs-variable"&gt;$child_extra&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;extra;
                &lt;span class="hljs-variable"&gt;$child_host_extra&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;host_extra;
                &lt;span class="hljs-variable"&gt;$child_host_class&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;

                &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$child_extra&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
                    &lt;span class="hljs-variable"&gt;$child_extra_cost_1&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34;_1&amp;#34;&lt;/span&gt;};
                    &lt;span class="hljs-variable"&gt;$child_extra_cost_2&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_child_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34;_2&amp;#34;&lt;/span&gt;};

                    &lt;span class="hljs-variable"&gt;$default_child_extra&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$host_price&lt;/span&gt; == &lt;span class="hljs-number"&gt;0&lt;/span&gt; ? &lt;span class="hljs-variable"&gt;$child_extra_cost_2&lt;/span&gt; : &lt;span class="hljs-variable"&gt;$child_extra_cost_1&lt;/span&gt;;
                    &lt;span class="hljs-variable"&gt;$child_cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39; : +&amp;lt;span class=&amp;#34;extra-cost&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$default_child_extra&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) .
                        &lt;span class="hljs-string"&gt;&amp;#34;&amp;lt;/span&amp;gt;&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34; - &amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39; : +&amp;lt;span class=&amp;#34;child-cost&amp;#34;&amp;gt;0.00&amp;lt;/span&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;

                    &lt;span class="hljs-variable"&gt;$child_host_class&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34; extra-option&amp;#34;&lt;/span&gt;;
                }
                &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$child_host_extra&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
                    &lt;span class="hljs-variable"&gt;$child_host_cost_display&lt;/span&gt; =
                        &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;span class=&amp;#34;host-cost&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;500&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39; : +&amp;lt;span class=&amp;#34;host-price&amp;#34;&amp;gt;0.00&amp;lt;/span&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt; .
                        &lt;span class="hljs-string"&gt;&amp;#34;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;#34;&lt;/span&gt;;
                }

                &lt;span class="hljs-comment"&gt;// Add the child option to the template&lt;/span&gt;
                &lt;span class="hljs-variable"&gt;$TEMPLATE&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;SET_BLOCK_VARIABLES&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;Block_OPTIONS.Block_OPTIONS_CHILD&amp;#34;&lt;/span&gt;, [
                    &lt;span class="hljs-string"&gt;&amp;#34;ID&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_quantity&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;LABEL_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_label_class&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;ACTION_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_action_class&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;LABEL&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_label&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;DESCRIPTION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_description&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_quantity_block&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;COST_INFO&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_cost_info&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;HOST_COST_DISPLAY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_host_cost_display&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_cost&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;CHILD_COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_extra_cost&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;LOCATION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_location&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;CATEGORY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_category&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;HOST_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_host_class&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_extra&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;HOST_EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_host_extra&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;TIME_CHECKED&amp;#34;&lt;/span&gt; =&amp;gt; (&lt;span class="hljs-variable"&gt;$child_has_times&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) ? &lt;span class="hljs-string"&gt;&amp;#39;selected=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$child_option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; checked=&amp;#34;true&amp;#34;&amp;#39;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
                    &lt;span class="hljs-string"&gt;&amp;#34;TIME_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$child_time_block&lt;/span&gt;
                ]);

                &lt;span class="hljs-variable"&gt;$resm_sibling_data&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$data_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetchData&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;parent=&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$parent_option_id&lt;/span&gt;);
                &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$resm_sibling_data&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$sibling_key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_value&lt;/span&gt;) {
                    &lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$sibling_value&lt;/span&gt;-&amp;gt;option_id;
                    &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$detail_source&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;fetch&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt;);
                    &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;) {
                        &lt;span class="hljs-variable"&gt;$sibling_label&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;label&lt;span class="hljs-subst"&gt;$lang&lt;/span&gt;&amp;#34;&lt;/span&gt;};
                        &lt;span class="hljs-variable"&gt;$sibling_description&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;description&lt;span class="hljs-subst"&gt;$lang&lt;/span&gt;&amp;#34;&lt;/span&gt;};
                        &lt;span class="hljs-variable"&gt;$sibling_category&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;category;

                        &lt;span class="hljs-comment"&gt;// Process cost for sibling category&lt;/span&gt;
                        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$sibling_category&lt;/span&gt; == &lt;span class="hljs-number"&gt;0&lt;/span&gt;) {
                            &lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                            &lt;span class="hljs-variable"&gt;$sibling_extra_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;sibling_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                            &lt;span class="hljs-variable"&gt;$sibling_cost_info&lt;/span&gt; =
                                &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34; - &amp;#34;&lt;/span&gt; .
                                &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$sibling_extra_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
                        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$sibling_category&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
                            &lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                            &lt;span class="hljs-variable"&gt;$sibling_extra_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                            &lt;span class="hljs-variable"&gt;$sibling_cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
                        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$sibling_category&lt;/span&gt; == &lt;span class="hljs-number"&gt;2&lt;/span&gt;) {
                            &lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                            &lt;span class="hljs-variable"&gt;$sibling_extra_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;sibling_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                            &lt;span class="hljs-variable"&gt;$sibling_cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$sibling_extra_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
                        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$sibling_category&lt;/span&gt; == &lt;span class="hljs-number"&gt;4&lt;/span&gt;) {
                            &lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                            &lt;span class="hljs-variable"&gt;$sibling_extra_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                            &lt;span class="hljs-variable"&gt;$sibling_cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;500&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
                        } &lt;span class="hljs-keyword"&gt;elseif&lt;/span&gt; (
                            &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;} == &lt;span class="hljs-number"&gt;0&lt;/span&gt; &lt;span class="hljs-keyword"&gt;and&lt;/span&gt;
                            &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;sibling_cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;} == &lt;span class="hljs-number"&gt;0&lt;/span&gt;
                        ) {
                            &lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                            &lt;span class="hljs-variable"&gt;$sibling_extra_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                            &lt;span class="hljs-variable"&gt;$sibling_cost_info&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
                        } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
                            &lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt;};
                            &lt;span class="hljs-variable"&gt;$sibling_extra_cost&lt;/span&gt; = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;
                            &lt;span class="hljs-variable"&gt;$sibling_cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;200&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#34; : +&amp;#34;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;
                        }

                        &lt;span class="hljs-variable"&gt;$sibling_location&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;location;
                        &lt;span class="hljs-variable"&gt;$sibling_label_class&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$sibling_location&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt; ? &lt;span class="hljs-string"&gt;&amp;#34;has-quantity&amp;#34;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#34;no-quantity&amp;#34;&lt;/span&gt;;
                        &lt;span class="hljs-variable"&gt;$sibling_action_class&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$sibling_location&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt; ? &lt;span class="hljs-string"&gt;&amp;#34;active-with-quantity&amp;#34;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#34;active-no-quantity&amp;#34;&lt;/span&gt;;
                        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$sibling_location&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
                            &lt;span class="hljs-variable"&gt;$sibling_quantity_block&lt;/span&gt; =
                                &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;quantity-container&amp;#34;&amp;gt;
                    &amp;lt;input type=&amp;#34;text&amp;#34; value=&amp;#34;1&amp;#34; id=&amp;#34;sibling-quantity-&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; class=&amp;#34;qty-control&amp;#34; name=&amp;#34;quantity&amp;#34; min=&amp;#34;1&amp;#34; max=&amp;#34;1&amp;#34;&amp;gt;
                    &amp;lt;div class=&amp;#34;increase button&amp;#34;&amp;gt;+&amp;lt;/div&amp;gt;
                    &amp;lt;div class=&amp;#34;decrease button&amp;#34;&amp;gt;-&amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;
                            &lt;span class="hljs-variable"&gt;$sibling_quantity&lt;/span&gt; = &lt;span class="hljs-number"&gt;1&lt;/span&gt;;
                        } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
                            &lt;span class="hljs-variable"&gt;$sibling_quantity_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
                            &lt;span class="hljs-variable"&gt;$sibling_quantity&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;all&amp;#34;&lt;/span&gt;;
                        }

                        &lt;span class="hljs-variable"&gt;$sibling_has_times&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;has_times;

                        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$sibling_has_times&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
                            &lt;span class="hljs-variable"&gt;$sibling_time_counter&lt;/span&gt;++;
                            &lt;span class="hljs-variable"&gt;$sibling_time_data&lt;/span&gt; = &lt;span class="hljs-title function_ invoke__"&gt;json_decode&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;time_data);

                            &lt;span class="hljs-variable"&gt;$sibling_departure_select&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;-1&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;300&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
                            &lt;span class="hljs-variable"&gt;$sibling_arrival_select&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;-1&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;301&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;

                            &lt;span class="hljs-variable"&gt;$sibling_departures&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$sibling_time_data&lt;/span&gt;-&amp;gt;departures;
                            &lt;span class="hljs-variable"&gt;$sibling_arrivals&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$sibling_time_data&lt;/span&gt;-&amp;gt;arrivals;

                            &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$sibling_departures&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$sibling_dep_key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_departure&lt;/span&gt;) {
                                &lt;span class="hljs-variable"&gt;$sibling_departure_select&lt;/span&gt; .= &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_dep_key&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_departure&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
                            }

                            &lt;span class="hljs-keyword"&gt;foreach&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$sibling_arrivals&lt;/span&gt; &lt;span class="hljs-keyword"&gt;as&lt;/span&gt; &lt;span class="hljs-variable"&gt;$sibling_arr_key&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_arrival&lt;/span&gt;) {
                                &lt;span class="hljs-variable"&gt;$sibling_arrival_select&lt;/span&gt; .= &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;option value=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_arr_key&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_arrival&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/option&amp;gt;&amp;#39;&lt;/span&gt;;
                            }

                            &lt;span class="hljs-variable"&gt;$sibling_departure_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;col-half time-select-&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; style=&amp;#34;padding-right: 0;&amp;#34;&amp;gt;
                &amp;lt;select class=&amp;#34;form-control time-departure&amp;#34; style=&amp;#34;text-align: center;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_departure_select&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/select&amp;gt;
                &amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;

                            &lt;span class="hljs-variable"&gt;$sibling_arrival_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;col-half time-select-&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; style=&amp;#34;padding-left: 0;&amp;#34;&amp;gt;
                &amp;lt;select class=&amp;#34;form-control time-arrival&amp;#34; style=&amp;#34;text-align: center;&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_arrival_select&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/select&amp;gt;
                &amp;lt;/div&amp;gt;&amp;#39;&lt;/span&gt;;

                            &lt;span class="hljs-variable"&gt;$sibling_time_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;div class=&amp;#34;row time-container&amp;#34;&amp;gt;
                &amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_departure_block&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_arrival_block&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;
            &amp;lt;/div&amp;gt;&amp;lt;small class=&amp;#34;error-message time-error&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;302&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;/small&amp;gt;&amp;#39;&lt;/span&gt;;
                        } &lt;span class="hljs-keyword"&gt;else&lt;/span&gt; {
                            &lt;span class="hljs-variable"&gt;$sibling_time_block&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
                        }

                        &lt;span class="hljs-variable"&gt;$sibling_host_cost_display&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;
                        &lt;span class="hljs-variable"&gt;$sibling_extra&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;extra;
                        &lt;span class="hljs-variable"&gt;$sibling_host_extra&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;host_extra;
                        &lt;span class="hljs-variable"&gt;$sibling_host_class&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34;&amp;#34;&lt;/span&gt;;

                        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$sibling_extra&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
                            &lt;span class="hljs-variable"&gt;$sibling_extra_cost_1&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34;_1&amp;#34;&lt;/span&gt;};
                            &lt;span class="hljs-variable"&gt;$sibling_extra_cost_2&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$resm_sibling_details&lt;/span&gt;-&amp;gt;{&lt;span class="hljs-string"&gt;&amp;#34;cost&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34;_2&amp;#34;&lt;/span&gt;};

                            &lt;span class="hljs-variable"&gt;$default_sibling_extra&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$host_price&lt;/span&gt; == &lt;span class="hljs-number"&gt;0&lt;/span&gt; ? &lt;span class="hljs-variable"&gt;$sibling_extra_cost_2&lt;/span&gt; : &lt;span class="hljs-variable"&gt;$sibling_extra_cost_1&lt;/span&gt;;
                            &lt;span class="hljs-variable"&gt;$sibling_cost_info&lt;/span&gt; = &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;101&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39; : +&amp;lt;span class=&amp;#34;extra-cost&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-title function_ invoke__"&gt;number_format&lt;/span&gt;(&lt;span class="hljs-variable"&gt;$default_sibling_extra&lt;/span&gt;, &lt;span class="hljs-number"&gt;2&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34;,&amp;#34;&lt;/span&gt;, &lt;span class="hljs-string"&gt;&amp;#34; &amp;#34;&lt;/span&gt;) .
                                &lt;span class="hljs-string"&gt;&amp;#34;&amp;lt;/span&amp;gt;&amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#34; - &amp;#34;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;102&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39; : +&amp;lt;span class=&amp;#34;sibling-cost&amp;#34;&amp;gt;0.00&amp;lt;/span&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt;;

                            &lt;span class="hljs-variable"&gt;$sibling_host_class&lt;/span&gt; = &lt;span class="hljs-string"&gt;&amp;#34; extra-option&amp;#34;&lt;/span&gt;;
                        }
                        &lt;span class="hljs-keyword"&gt;if&lt;/span&gt; (&lt;span class="hljs-variable"&gt;$sibling_host_extra&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) {
                            &lt;span class="hljs-variable"&gt;$sibling_host_cost_display&lt;/span&gt; =
                                &lt;span class="hljs-string"&gt;&amp;#39;&amp;lt;span class=&amp;#34;host-cost&amp;#34;&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$mot&lt;/span&gt;[&lt;span class="hljs-number"&gt;500&lt;/span&gt;] . &lt;span class="hljs-string"&gt;&amp;#39; : +&amp;lt;span class=&amp;#34;host-price&amp;#34;&amp;gt;0.00&amp;lt;/span&amp;gt;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$currency_symbol&lt;/span&gt; .
                                &lt;span class="hljs-string"&gt;&amp;#34;&amp;lt;/span&amp;gt;&amp;lt;br&amp;gt;&amp;#34;&lt;/span&gt;;
                        }

                        &lt;span class="hljs-comment"&gt;// Add the sibling option to the template&lt;/span&gt;
                        &lt;span class="hljs-variable"&gt;$TEMPLATE&lt;/span&gt;-&amp;gt;&lt;span class="hljs-title function_ invoke__"&gt;SET_BLOCK_VARIABLES&lt;/span&gt;(&lt;span class="hljs-string"&gt;&amp;#34;Block_OPTIONS.Block_OPTIONS_CHILD&amp;#34;&lt;/span&gt;, [
                            &lt;span class="hljs-string"&gt;&amp;#34;ID&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_quantity&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;LABEL_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_label_class&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;ACTION_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_action_class&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;LABEL&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_label&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;DESCRIPTION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_description&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;QUANTITY_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_quantity_block&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;COST_INFO&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_cost_info&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;HOST_COST_DISPLAY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_host_cost_display&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_cost&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;SIBLING_COST&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_extra_cost&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;LOCATION&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_location&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;CATEGORY&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_category&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;HOST_CLASS&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_host_class&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_extra&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;HOST_EXTRA&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_host_extra&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;TIME_CHECKED&amp;#34;&lt;/span&gt; =&amp;gt; (&lt;span class="hljs-variable"&gt;$sibling_has_times&lt;/span&gt; == &lt;span class="hljs-number"&gt;1&lt;/span&gt;) ? &lt;span class="hljs-string"&gt;&amp;#39;selected=&amp;#34;&amp;#39;&lt;/span&gt; . &lt;span class="hljs-variable"&gt;$sibling_option_id&lt;/span&gt; . &lt;span class="hljs-string"&gt;&amp;#39;&amp;#34; checked=&amp;#34;true&amp;#34;&amp;#39;&lt;/span&gt; : &lt;span class="hljs-string"&gt;&amp;#39;&amp;#39;&lt;/span&gt;,
                            &lt;span class="hljs-string"&gt;&amp;#34;TIME_BLOCK&amp;#34;&lt;/span&gt; =&amp;gt; &lt;span class="hljs-variable"&gt;$sibling_time_block&lt;/span&gt;
                        ]);
                    }
                }
            }
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;!-- Easy Reader Version: Who doesn't love a gigantic code blob? --&gt;
&lt;style&gt;.comment { border: none; }&lt;/style&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	ProGet’s got you covered with security and access controls on your NuGet feeds. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=GotYouCoveredFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>20</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/the-big-family</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Lock 'Em Dead</title><link>https://thedailywtf.com/articles/lock-em-dead</link><category>CodeSOD</category><pubDate>Wed, 26 Aug 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/lock-em-dead</guid><description>&lt;p&gt;&lt;strong&gt;Kevin&lt;/strong&gt; sends us an exception handler from C++. Let&amp;#39;s see if we can spot what&amp;#39;s going wrong:&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-cpp"&gt;&lt;span class="hljs-built_in"&gt;catch&lt;/span&gt; (Exception::Deadlock)
{
   retry;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;When we catch a deadlock happening, we &lt;code&gt;retry&lt;/code&gt;. That&amp;#39;s not a keyword in C++, and looking at how it&amp;#39;s used, it has to be some kind of macro, and I suspect that the macro is hiding a &lt;code&gt;goto&lt;/code&gt; underneath it.&lt;/p&gt;
&lt;p&gt;The real problem, though, is that we suspect we&amp;#39;re in a deadlock situation. That means this thread is waiting on a resource held by another thread which is waiting for a resource held by this thread. Neither train may continue until the other has passed. So this &lt;code&gt;retry&lt;/code&gt; only works if it releases the resource held by this thread (letting the deadlocking thread proceed). But does it?&lt;/p&gt;
&lt;p&gt;Not according ot Kevin. The code already had a pile of deadlocks in it, so they brought in a highly paid consultant to try and fix them by reordering access and tracing where mutexes were causing issues. This &lt;code&gt;retry&lt;/code&gt; just jumps back up to the top of the block, without releasing any resources. It &amp;#34;seems the consultant wanted to add some deadlocks of their own,&amp;#34; Kevin says.&lt;/p&gt;
&lt;!-- Easy Reader Version: Usually it's "kill a thread" to clear a deadlock, but not for this HPC. --&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;BuildMaster&lt;/a&gt; allows you to create a self-service release management platform that allows different teams to manage their applications. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Explore how!&lt;/a&gt; 
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>26</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/lock-em-dead</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Representative Line: Both Ways Bug Me</title><link>https://thedailywtf.com/articles/both-ways-bug-me</link><category>Representative Line</category><pubDate>Tue, 25 Aug 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/both-ways-bug-me</guid><description>&lt;p&gt;There are many cases where some sort of debugging block sneaks by, especially cases where we see preprocessors or templates working, which leave us with nonsense like &lt;code&gt;if (true == false)&lt;/code&gt; running in production. But &lt;strong&gt;Codemonkey&lt;/strong&gt; found a new twist on that sort of thing, in a SQL query being run in production.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-sql"&gt;&lt;span class="hljs-keyword"&gt;WHERE&lt;/span&gt; (&lt;span class="hljs-keyword"&gt;some&lt;/span&gt; conditions) &lt;span class="hljs-keyword"&gt;AND&lt;/span&gt; (&lt;span class="hljs-number"&gt;1&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt; &lt;span class="hljs-keyword"&gt;OR&lt;/span&gt; (&lt;span class="hljs-number"&gt;1&lt;/span&gt; &lt;span class="hljs-operator"&gt;=&lt;/span&gt; &lt;span class="hljs-number"&gt;1&lt;/span&gt; &lt;span class="hljs-keyword"&gt;AND&lt;/span&gt; (other conditions)))
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;code&gt;OR&lt;/code&gt; means that by twiddling the first equality check, we can toggle &amp;#34;always return rows&amp;#34; with &amp;#34;return based on condition&amp;#34;. Toggling the second we can make it &amp;#34;never return rows&amp;#34;, which I&amp;#39;m not certain is actually useful. I can see how these likely did start life as debugging flags, but they&amp;#39;re still weird, still unnatural. They point to some other problem in observability in the code. And, as all &amp;#34;good&amp;#34; flags go, they&amp;#39;re not documented anywhere, this seems like it started life as a query an analyst was running until it got turned into stored procedure to be run again and again. The flags have never been changed since the code was released, as far as anyone can tell.&lt;/p&gt;
&lt;!-- Easy Reader Version: Adding debugging conditionals is an antipattern; you should always invoke your debugging methods and hide the conditional THERE, the way logging works (you set the log level, the logger decides what to output). Never have non-debugging code make decisions about whether or not debugging is enabled. --&gt;&lt;div&gt;
	[Advertisement] &lt;b&gt;Plan Your .NET 9 Migration with Confidence&lt;/b&gt;&lt;br/&gt;Your journey to .NET 9 is more than just one decision.Avoid migration migraines with the advice in this free guide. &lt;b&gt;&lt;a href="https://inedo.com/support/whitepapers/dotnet-guide?utm_campaign=dotnet&amp;amp;utm_source=tdwtf-footer"&gt;Download Free Guide Now!&lt;/a&gt;&lt;/b&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>9</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/both-ways-bug-me</wfw:comment></item><item><dc:creator>Ellis Morning</dc:creator><title>RCE As a Feature</title><link>https://thedailywtf.com/articles/rce-as-a-feature</link><category>Feature Articles</category><pubDate>Mon, 24 Aug 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/rce-as-a-feature</guid><description>&lt;p&gt;The opposite of meritocracy is &lt;a href="https://en.wiktionary.org/wiki/kakistocracy"&gt;kakistocracy:&lt;/a&gt; the worst and least-qualified are the ones who rise to the top.&lt;/p&gt;
&lt;p&gt;Get real familiar with that word, dear readers. I think you&amp;#39;ll need it.&lt;/p&gt;
&lt;p&gt;If anyone can back me up on this, it&amp;#39;s our submitter, &lt;b&gt;Jared B:&lt;/b&gt;&lt;/p&gt;
&lt;p style="float:right; padding-left:10px; padding-bottom:10px;"&gt;&lt;a title="Time Magazine, Public domain, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Time_Magazine_cover_April_3,_2017.webp"&gt;&lt;img itemprop="image" width="300" alt="Time Magazine cover April 3, 2017" src="https://upload.wikimedia.org/wikipedia/commons/thumb/e/e9/Time_Magazine_cover_April_3%2C_2017.webp/250px-Time_Magazine_cover_April_3%2C_2017.webp.png?utm_source=commons.wikimedia.org&amp;amp;utm_campaign=index&amp;amp;utm_content=thumbnail"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am a teacher by profession, and worked for a year at an ed-tech company founded by a mechanical engineering professor, Harry. Harry had spent a great deal of time in the 90&amp;#39;s developing a C interpreter (yes, you read that right). 30 years later, he remained convinced that his interpreter was the technology of the future, and had founded a company that offered math and computer science curriculum to K-12 students based on C programming.&lt;/p&gt;
&lt;p&gt;Originally, he had written a textbook that introduced students to programming using a locally-installed version of his interpreter and custom IDE. A little vain, but no serious problems. As Chromebooks grew popular in schools, he had developed a web IDE where students could write and run C code.&lt;/p&gt;
&lt;p&gt;But Harry could never give fully give up on the Windows IDE for his C interpreter. So, he included in the web version a &amp;#34;Run Locally&amp;#34; button for those school computers still running Windows. It worked like so: installing the interpreter and IDE locally would also install a daemon that activated on startup and ran a websocket server. This server had an endpoint which accepted as a parameter a string of C code. It would then pass this C code to the locally-installed interpreter to run.&lt;/p&gt;
&lt;p&gt;As you might suspect, there was no authentication whatsoever on this local websocket server. Knowing the form of the protocol, ANY domain could connect to &lt;code&gt;localhost:12345/execute_c_program&lt;/code&gt; and send arbitrary code to run (of course, Harry prided himself on the completeness of his C implementation, including &lt;code&gt;execv()&lt;/code&gt; and the like). Trick a user into visiting a malicious website, and you automatically had RCE on their computer.&lt;/p&gt;
&lt;p&gt;Adding insult to injury, I discovered that the server was bound to &lt;code&gt;0.0.0.0&lt;/code&gt; so that if you had Harry&amp;#39;s software (/malware) installed, any computer on the same network as you could send you arbitrary C code to execute without question.&lt;/p&gt;
&lt;p&gt;These vulnerabilities had existed for several years before I joined the company. In all that time, Harry had never hired anybody but his own grad students as software developers, and none of them had noticed the problem. By that time, the software was installed on thousands of school-owned computers throughout the state.&lt;/p&gt;
&lt;p&gt;I documented and demonstrated the vulnerabilities to Harry. He did release a new version of the software addressing the issues and citing &amp;#34;security improvements&amp;#34; in the release notes, but there was never a communication to school/district IT leaders to describe the importance of updating. I suspect that Harry should be in serious legal trouble for potentially compromising data related to schools and minors, but I&amp;#39;ve since moved on and dropped the subject.&lt;/p&gt;
&lt;p&gt;During the year I spent at the company (not in any sense as a dev, mind you, but as a lowly curriculum writer), I also discovered and reported a cookie-stealing exploit that would have compromised student and teacher data, as well as a code injection on another of Harry&amp;#39;s websites (he decided to demonstrate that his C interpreter could work as a web server via a page where a user could type a math expression, which was then &lt;code&gt;eval()&lt;/code&gt;ed server-side without any sanitation). The latter vulnerability gave me remote access, where I discovered thousands of transaction records that included credit card information stored in the clear.&lt;/p&gt;
&lt;p&gt;Harry&amp;#39;s company is still in business to this day, and has recently been ranked in TIME&amp;#39;s list of top American ed-tech companies. Oh, and the office router&amp;#39;s admin page still had the default Google-able username and password, but that one&amp;#39;s a freebie.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I knew someone like this once, only they were stuck on ColdFusion long after everyone else stopped caring about it. However, I don&amp;#39;t &lt;i&gt;think&lt;/i&gt; they went on to endanger an entire state&amp;#39;s educational system, only to be lauded as a visionary leader. Can&amp;#39;t say for sure, though.&lt;/p&gt;
            &lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=PlebsFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>10</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/rce-as-a-feature</wfw:comment></item><item><dc:creator>Lyle Seaman</dc:creator><title>Error'd: Failure, After Failure, After Failure...</title><link>https://thedailywtf.com/articles/failure-after-failure-after-failure</link><category>Error'd</category><pubDate>Fri, 21 Aug 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/failure-after-failure-after-failure</guid><description>&lt;p&gt;We have a couple from Foo (AKA Foo) today, include a special text copy-paste&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Foo&lt;/strong&gt; shared 
&amp;#34;I know you usually post image WTFs here, but here&amp;#39;s a text output from chromium:
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;
  [...:ERROR:components/viz/service/display/display.cc:273] Frame latency is negative: -0.18 ms
&lt;/p&gt;&lt;/blockquote&gt;
While this issue might be fixed by now, at least on
&lt;a href="https://issues.chromium.org/issues/432283599"&gt;some platforms&lt;/a&gt;,
I think it&amp;#39;s remarkable that someone actually wrote
&lt;a href="https://chromium.googlesource.com/chromium/src/+/HEAD/components/viz/service/display/display.cc"&gt;
this message&lt;/a&gt; without wondering if it ever makes sense ...

&lt;p&gt;&lt;/p&gt;&lt;p&gt;And also commented 
&amp;#34;I visited Spain to see the eclipse (which was great BTW).
I had heard that temperature may drop during totality, but
was surprised by how much.&amp;#34;  Negative Infinity!
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#0be1027004e44b13bd405c187d01c644"&gt;&lt;img itemprop="image" border="0" alt="0be1027004e44b13bd405c187d01c644" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/20/0be1027004e44b13bd405c187d01c644.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Youfailedatmathtube&amp;#34; muttered 
&lt;strong&gt;dragoncoder047&lt;/strong&gt;, snarking only &amp;#34;Title.&amp;#34;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#afc0394174854c19aaa86bbee370f978"&gt;&lt;img itemprop="image" border="0" alt="afc0394174854c19aaa86bbee370f978" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/20/afc0394174854c19aaa86bbee370f978.jpeg"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;


&lt;p&gt;&amp;#34;Hello to you too, New Mexico!&amp;#34; enthused 
&lt;strong&gt;Chris A.&lt;/strong&gt;
&amp;#34;Setting up web sites is hard. The DOT got
bored half way through and just left the rest of
the buttons as they were.&amp;#34; 
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#fbe8150c963d4abaac4897bf083e1992"&gt;&lt;img itemprop="image" border="0" alt="fbe8150c963d4abaac4897bf083e1992" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/20/fbe8150c963d4abaac4897bf083e1992.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Finally, &amp;#34;Failure Fail&amp;#34; from 
&lt;strong&gt;Basti&lt;/strong&gt;
&amp;#34;Did I succeed or did I fail? Is my whole
life a success? Or a failure? I&amp;#39;m confused. 
You can find this
&lt;a href="https://doc.owncloud.com/server/latest/developer_manual/core/apis/ocs-share-api.html#code-example-6"&gt;
here.&lt;/a&gt;
&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;a href="#fc74a13838f6458587db51bd80405415"&gt;&lt;img itemprop="image" border="0" alt="fc74a13838f6458587db51bd80405415" src="https://d3hvi6t161kfmf.cloudfront.net/images/2026/08/20/fc74a13838f6458587db51bd80405415.png"/&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;/blockquote&gt;

&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/buildmaster-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	&lt;a href="https://inedo.com/BuildMaster?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;BuildMaster&lt;/a&gt; allows you to create a self-service release management platform that allows different teams to manage their applications. &lt;a href="https://inedo.com/BuildMaster/download?utm_source=tdwtf&amp;amp;utm_medium=footerad&amp;amp;utm_term=2018&amp;amp;utm_content=Self_Service&amp;amp;utm_campaign=Buildmaster_Footer"&gt;Explore how!&lt;/a&gt; 
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>6</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/failure-after-failure-after-failure</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>Representative Line: We All Register This</title><link>https://thedailywtf.com/articles/we-all-register-this</link><category>Representative Line</category><pubDate>Thu, 20 Aug 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/we-all-register-this</guid><description>&lt;p&gt;Today&amp;#39;s maybe more of a &amp;#34;representative data sheet entry&amp;#34; than anything else.&lt;/p&gt;
&lt;p&gt;Every developer has the experience of reading the documentation. If you&amp;#39;ve been at this for some time, you&amp;#39;ve probably read &lt;em&gt;bad&lt;/em&gt; documentation. Documentation that is incomplete, inaccurate, or otherwise flawed. Or, my personal favorite, the brief time where Oracle tried to put all of its documentation into an Adobe Flex site (aka, a Flash application, not a real web app). That one had fun bonus features, like &amp;#34;breaking copy and paste&amp;#34; and &amp;#34;preventing you from deep linking to a piece of the documentation&amp;#34;.&lt;/p&gt;
&lt;p&gt;But software documentation has got &lt;em&gt;nothing&lt;/em&gt; on bad data sheets. When you buy an integrated chip from a vendor, whether it&amp;#39;s a microcontroller that&amp;#39;ll run your code, a sensor you&amp;#39;re trying to get data from, you&amp;#39;re at the mercy of the datasheet for understanding how it works. Sometimes, even finding an English language datasheet can be a challenge. The more complex the chip you&amp;#39;re trying to interact with, the more complex the datasheet needs to be, and at a certain point, a lot of vendors say, &amp;#34;meh, you&amp;#39;ll figure it out.&amp;#34; I&amp;#39;ve had chips where the datasheet and reality disagreed about what registers were available, which often means that core functions of the chip require twiddling undocumented registers. For more fun, they sometimes lie about which pins on the chip do which thing, including &lt;em&gt;mislabeling which pins handle power&lt;/em&gt;. There&amp;#39;s nothing more fun than the tiny little &amp;#34;pop&amp;#34; of a chip dying when you throw 5V power onto a pin that&amp;#39;s actually ground.&lt;/p&gt;
&lt;p&gt;Now, there are some vendors, and some products, where the datasheets are pretty solid. This isn&amp;#39;t a universal problem, but when you&amp;#39;re working in an embedded space, &amp;#34;cheapest&amp;#34; is frequently the main criteria for picking components, and &amp;#34;cheapest&amp;#34; means &amp;#34;worst documented&amp;#34;.&lt;/p&gt;
&lt;p&gt;Which brings us to &lt;strong&gt;Jarek&lt;/strong&gt;&amp;#39;s recent experience going through a data sheet. The chip in question had a &amp;#34;fantastic feature&amp;#34; that would change how debugging worked, which was for &amp;#34;super users&amp;#34; to enable by setting a register.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;3.2.4 Super User Fantastic Feature Enable Register
The Super User Fantastic Feature Enable Register allows the user to modify the behavior of the mEDBG.
Name: SUFFER
Offset:  0x0120
Reset: 0xFF
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Sometimes, doing embedded work definitely feels like the &lt;code&gt;SUFFER&lt;/code&gt; register is set.&lt;/p&gt;
&lt;!-- Easy Reader Version: I haven't tried to piece together a datasheet from a Chinese language PDF more than once or twice, but I *have* had to do it. --&gt;&lt;div&gt;
	[Advertisement] Picking up &lt;b&gt;NuGet&lt;/b&gt; is easy. Getting good at it takes time. &lt;a href="https://inedo.com/support/whitepapers/nuget-guide?utm_source=tdwtf&amp;amp;utm_medium=Footerad&amp;amp;utm_campaign=nuget"&gt;Download our guide to learn the best practice of NuGet for the Enterprise.&lt;/a&gt;

&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;</description><slash:comments>23</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/we-all-register-this</wfw:comment></item><item><dc:creator>Remy Porter</dc:creator><title>CodeSOD: Back to the Lab</title><link>https://thedailywtf.com/articles/back-to-the-lab</link><category>CodeSOD</category><pubDate>Wed, 19 Aug 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/back-to-the-lab</guid><description>&lt;p&gt;Matlab is &lt;em&gt;special&lt;/em&gt;. Scientists and researchers love it. Programmers hate it, and not just because it uses 1-based arrays. I&amp;#39;ve worked on a number of projects where the task was &amp;#34;take this Matlab code and convert it to C so we can run it on an embedded CPU&amp;#34;. Somehow, in that process, I&amp;#39;ve avoided learning much about Matlab.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Andre&lt;/strong&gt; works on a team that uses Matlab to manage experimental scenarios. They wanted to do a simple task: generate a set of participant-specific images, store them in a database, and reference them later. Somewhere in the intersection of the database product they were using, the Matlab license they had, and other constraints, they discovered that there simply was no good way to do this.&lt;/p&gt;
&lt;p&gt;Enter &amp;#34;Jude&amp;#34;. Jude said, &amp;#34;Don&amp;#39;t worry about it, I can hack something together.&amp;#34;&lt;/p&gt;
&lt;p&gt;I present the code in its entirety, but don&amp;#39;t ask me to explain it. Instead, read the comments.&lt;/p&gt;
&lt;pre&gt;&lt;code class="language-matlab"&gt;nMk = &lt;span class="hljs-number"&gt;1&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%counting non-response triggers, this cycles with each trial&lt;/span&gt;
nPress = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%counting button presses, noting the position in the log&lt;/span&gt;

&lt;span class="hljs-keyword"&gt;for&lt;/span&gt; v = &lt;span class="hljs-number"&gt;1&lt;/span&gt;:height(resVmrk)&lt;span class="hljs-comment"&gt;%read each trigger&lt;/span&gt;
	&lt;span class="hljs-keyword"&gt;switch&lt;/span&gt; nMk
		&lt;span class="hljs-comment"&gt;%it&amp;#39;s kinda roundabout, but the only recognisable part is the response&lt;/span&gt;
		&lt;span class="hljs-comment"&gt;%yet I refer to it only by elision&lt;/span&gt;
		&lt;span class="hljs-comment"&gt;%and instead count the stimuli to reconstruct the pattern&lt;/span&gt;
		&lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-number"&gt;1&lt;/span&gt;&lt;span class="hljs-comment"&gt;%an almost reliable stimulus&lt;/span&gt;
			nPress = nPress+&lt;span class="hljs-number"&gt;1&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%trial start&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; strcmp(resVmrk.TriggerCode{v},&lt;span class="hljs-string"&gt;&amp;#39;S1&amp;#39;&lt;/span&gt;)&lt;span class="hljs-comment"&gt;%it must be a non-response&lt;/span&gt;
				resVmrk.TriggerCode{v} = &lt;span class="hljs-string"&gt;&amp;#39;cross&amp;#39;&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%name it properly&lt;/span&gt;
				nMk = &lt;span class="hljs-number"&gt;2&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%and expect the next one&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;else&lt;/span&gt;&lt;span class="hljs-comment"&gt;%except when it is not&lt;/span&gt;
				resLog.miss(nPress) = &lt;span class="hljs-number"&gt;1&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%then note it down as missed&lt;/span&gt;
				nMk = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%and skip to response&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
			
		&lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-number"&gt;2&lt;/span&gt;&lt;span class="hljs-comment"&gt;%usually reliable&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; strcmp(resVmrk.TriggerCode{v},&lt;span class="hljs-string"&gt;&amp;#39;S1&amp;#39;&lt;/span&gt;)&lt;span class="hljs-comment"&gt;%if the face loaded successfully&lt;/span&gt;
				resVmrk.TriggerCode{v} = &lt;span class="hljs-string"&gt;&amp;#39;face&amp;#39;&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%note it&lt;/span&gt;
				nMk = &lt;span class="hljs-number"&gt;3&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%and proceed accordingly&lt;/span&gt;
				&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; nPress&amp;lt;=height(resLog)&lt;span class="hljs-comment"&gt;%trailing triggers at the end should be ignored&lt;/span&gt;
					resLog.facePos(nPress) = v;&lt;span class="hljs-comment"&gt;%note the position&lt;/span&gt;
				&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;else&lt;/span&gt;&lt;span class="hljs-comment"&gt;%if it failed to load it is a response&lt;/span&gt;
				resVmrk.Dur(v&lt;span class="hljs-number"&gt;-1&lt;/span&gt;:v+&lt;span class="hljs-number"&gt;1&lt;/span&gt;) = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%mark the whole trial for deletion&lt;/span&gt;
				resLog.miss(nPress) = &lt;span class="hljs-number"&gt;1&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%and note it down as missing the face&lt;/span&gt;
				nMk = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%and skip to response&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
			
		&lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-number"&gt;3&lt;/span&gt;&lt;span class="hljs-comment"&gt;%this one is not reliable, and sometimes is duplicated instead of missing&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; strcmp(resVmrk.TriggerCode{v},&lt;span class="hljs-string"&gt;&amp;#39;S1&amp;#39;&lt;/span&gt;)&lt;span class="hljs-comment"&gt;%if it is present at all&lt;/span&gt;
				resVmrk.TriggerCode{v} = &lt;span class="hljs-string"&gt;&amp;#39;empty&amp;#39;&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%first name it&lt;/span&gt;
				&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; v&amp;lt;height(resVmrk)&lt;span class="hljs-comment"&gt;%if it is not a trailing trigger, since it&amp;#39;ll break the check otherwise&lt;/span&gt;
					&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; ~strcmp(resVmrk.TriggerCode{v+&lt;span class="hljs-number"&gt;1&lt;/span&gt;},&lt;span class="hljs-string"&gt;&amp;#39;S1&amp;#39;&lt;/span&gt;)&lt;span class="hljs-comment"&gt;%if the next trigger is a response&lt;/span&gt;
						nMk = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%all is fine and it didn&amp;#39;t freak out, proceed to response&lt;/span&gt;
					&lt;span class="hljs-keyword"&gt;else&lt;/span&gt;&lt;span class="hljs-comment"&gt;%otherwise&lt;/span&gt;
						nMk = &lt;span class="hljs-number"&gt;3&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%just treat as a double&lt;/span&gt;
						&lt;span class="hljs-comment"&gt;%and then count how many excess triggers are actually here&lt;/span&gt;
						nExcess = &lt;span class="hljs-number"&gt;1&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%definitely one here already&lt;/span&gt;
						&lt;span class="hljs-keyword"&gt;while&lt;/span&gt; strcmp(resVmrk.TriggerCode{v+nExcess+&lt;span class="hljs-number"&gt;1&lt;/span&gt;},&lt;span class="hljs-string"&gt;&amp;#39;S1&amp;#39;&lt;/span&gt;)
							nExcess = nExcess+&lt;span class="hljs-number"&gt;1&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%and everything until the response&lt;/span&gt;
						&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
						resVmrk.Dur(v&lt;span class="hljs-number"&gt;-2&lt;/span&gt;:v+nExcess+&lt;span class="hljs-number"&gt;2&lt;/span&gt;) = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%then mark the whole trial for deletion&lt;/span&gt;
						&lt;span class="hljs-comment"&gt;%this overwrites the same positions several time, but the important part is to get the preceding two, because I don&amp;#39;t know which one of them is correct one, so I delete the whole trial&lt;/span&gt;
						&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; nPress&amp;lt;=height(resLog)
							resLog.bad(nPress) = &lt;span class="hljs-number"&gt;1&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%also note it down as borked&lt;/span&gt;
						&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
					&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
				&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;else&lt;/span&gt;
				nMk = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%if it didn&amp;#39;t happen at all simply proceed to response&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
			
		&lt;span class="hljs-keyword"&gt;case&lt;/span&gt; &lt;span class="hljs-number"&gt;0&lt;/span&gt;&lt;span class="hljs-comment"&gt;%this one reliably follows the response, so I address the response by elision&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; strcmp(resVmrk.TriggerCode{v},&lt;span class="hljs-string"&gt;&amp;#39;S1&amp;#39;&lt;/span&gt;)&lt;span class="hljs-comment"&gt;%skip response itself&lt;/span&gt;
				resVmrk.TriggerCode{v} = &lt;span class="hljs-string"&gt;&amp;#39;blink&amp;#39;&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%note the only reliable non-response (always following the response)&lt;/span&gt;
				nMk = &lt;span class="hljs-number"&gt;1&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%start the trial anew&lt;/span&gt;
				&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; nPress&amp;lt;=height(resLog)&lt;span class="hljs-comment"&gt;%if it is not a trailing trigger&lt;/span&gt;
					resLog.respPos(nPress) = v&lt;span class="hljs-number"&gt;-1&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%note down the response position&lt;/span&gt;
					&lt;span class="hljs-keyword"&gt;if&lt;/span&gt; resLog.miss(nPress)==&lt;span class="hljs-number"&gt;1&lt;/span&gt;&lt;span class="hljs-comment"&gt;%and if it&amp;#39;s a response without a stimulus&lt;/span&gt;
						resVmrk.Dur(v&lt;span class="hljs-number"&gt;-1&lt;/span&gt;:v) = &lt;span class="hljs-number"&gt;0&lt;/span&gt;;&lt;span class="hljs-comment"&gt;%mark it for deletion as well&lt;/span&gt;
					&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
				&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
			&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
	&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
&lt;span class="hljs-keyword"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Ah, the classic &amp;#34;for-case&amp;#34; antipattern. That&amp;#39;s gross enough, but what the heck is happening inside each of those cases?&lt;/p&gt;
&lt;p&gt;My personal favorite comment is this one: &amp;#34;%this overwrites the same positions several time, but the important part is to get the preceding two, because I don&amp;#39;t know which one of them is correct one, so I delete the whole trial&amp;#34;&lt;/p&gt;
&lt;p&gt;Now, you may suspect comments like &amp;#34;usually reliable&amp;#34; are about what we see in the dataset, but I&amp;#39;m not so certain. Andre writes:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;After reverting the last discovered way for his creation to corrupt the data I was able to figure out that 20% of the logs provided corresponded to different (unknown) experiments altogether.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;style&gt;.comment { border: none; }&lt;/style&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	Keep the plebs out of prod. Restrict NuGet feed privileges with ProGet. &lt;a href="https://inedo.com/proget/private-nuget-server?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=PlebsFooter&amp;amp;utm_campaign=Cyclops2020"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>9</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/back-to-the-lab</wfw:comment></item><item><dc:creator>Ellis Morning</dc:creator><title>Floating Along</title><link>https://thedailywtf.com/articles/floating-along</link><category>Feature Articles</category><pubDate>Tue, 18 Aug 2026 06:30:00 GMT</pubDate><guid>https://thedailywtf.com/articles/floating-along</guid><description>&lt;p&gt;Today&amp;#39;s submitter &lt;b&gt;John F.&lt;/b&gt; was migrating data from a Microsoft platform to a Microsoft platform, using Microsoft tools. Absolutely nothing could go wrong, right?&lt;/p&gt;
&lt;p&gt;Right?&lt;/p&gt;
&lt;p style="float:right; padding-left:10px; padding-bottom:10px;"&gt;&lt;a title="Brigban, CC0, via Wikimedia Commons" href="https://commons.wikimedia.org/wiki/File:Lining_up_the_decimal_points.jpg"&gt;&lt;img itemprop="image" width="300" alt="Lining up the decimal points" src="https://upload.wikimedia.org/wikipedia/commons/thumb/4/47/Lining_up_the_decimal_points.jpg/330px-Lining_up_the_decimal_points.jpg"/&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A few years ago, I was working on a migration. We had sold part of our business, and so we had to extract a whole bunch of customer documents and metadata to provide to the buyer. The documents were stored in SharePoint on-premises, so the first step was extracting the metadata and storing it in a SQL Server database.&lt;/p&gt;
&lt;p&gt;A colleague had used Microsoft&amp;#39;s ETL tool SSIS to get the process started, and it generated a database schema. But after taking over, I wanted to change to PowerShell for greater control. For speed reasons, I decided to use &lt;code&gt;System.Data.SqlClient.SqlBulkCopy&lt;/code&gt;, and getting that going required making sure my PowerShell script had all the correct data types.&lt;/p&gt;
&lt;p&gt;One of our fields was the customer number. Customer numbers were up to 10 digits, but the first two were usually 0. Now, I prefer storing customer numbers as text, but someone in the distant past thought, &lt;i&gt;This is a number, and SharePoint has a &lt;code&gt;Number&lt;/code&gt; field, so I will use that.&lt;/i&gt;&lt;/p&gt;
&lt;p&gt;Under the hood, &lt;code&gt;Number&lt;/code&gt; fields in SharePoint are actually &lt;code&gt;Doubles&lt;/code&gt;. Using a &lt;code&gt;Double&lt;/code&gt; to store something exact like a customer number is not really ideal, but double-precision is absolutely enough to represent 10 digit numbers accurately. So what went wrong?&lt;/p&gt;
&lt;p&gt;Well, remember we used SSIS to create the original table schema in SQL Server. I then used this table schema to write my script. But it turns out that in SQL Server world, the double-precision type is called &lt;code&gt;float&lt;/code&gt;. If you want single-precision, you have to say &lt;code&gt;float(24)&lt;/code&gt;. I didn&amp;#39;t know this, and so when I saw the SQL Server column as a &lt;code&gt;float&lt;/code&gt;, I entered &lt;code&gt;float&lt;/code&gt; as the corresponding .Net type in my script.&lt;/p&gt;
&lt;p&gt;Oops.&lt;/p&gt;
&lt;p&gt;So numbers came out of SharePoint as &lt;code&gt;double&lt;/code&gt;. They were then converted to &lt;code&gt;float&lt;/code&gt; before being inserted into SQL Server. Almost all records were fine, but large customer numbers had their last few digits changed. Testers didn&amp;#39;t notice, but fortunately someone picked it up in the full load. We had to generate a list of changed numbers to patch the data after the fact.&lt;/p&gt;
&lt;/blockquote&gt;&lt;div&gt;
	&lt;img src="https://thedailywtf.com/images/inedo/proget-icon.png" style="display:block; float: left; margin: 0 10px 10px 0;"/&gt; [Advertisement] 
	Keep all your packages and Docker containers in one place, scan for vulnerabilities, and control who can access different feeds. ProGet installs in minutes and has a powerful free version with a lot of great features that you can upgrade when ready.&lt;a href="https://inedo.com/proget?utm_source=tdwtf&amp;amp;utm_medium=footer&amp;amp;utm_content=PlebsFooter"&gt;Learn more.&lt;/a&gt;
&lt;/div&gt;
&lt;div style="clear: left;"&gt; &lt;/div&gt;
</description><slash:comments>26</slash:comments><wfw:comment>https://thedailywtf.com/articles/comments/floating-along</wfw:comment></item></channel></rss>