mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-07-16 17:47:22 +00:00
1 line
86 KiB
XML
1 line
86 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" contentStyleType="text/css" data-diagram-type="ACTIVITY" height="4696px" preserveAspectRatio="none" style="width:5627px;height:4696px;background:#FAFCF9;" version="1.1" viewBox="0 0 5627 4696" width="5627px" zoomAndPan="magnify"><?plantuml 1.2026.3?><defs/><g><rect fill="#FAFCF9" height="4696" style="stroke:none;stroke-width:1;" width="5627" x="0" y="0"/><g class="title" data-source-line="20"><text fill="#28342A" font-family="'Volkhov'" font-size="20" font-weight="700" lengthAdjust="spacing" textLength="642.86" x="2491.4194" y="39.42">The Biergarten Data Pipeline (Current — Synchronous Data Path)</text></g><rect fill="none" height="18.228" style="stroke:none;stroke-width:1;" width="5580.6989" x="20" y="64.64"/><rect fill="#F2F6F0" height="4611.08" style="stroke:#F2F6F0;stroke-width:1;" width="745.0757" x="20" y="64.64"/><ellipse cx="254.8274" cy="97.868" fill="#222222" rx="10" ry="10" style="stroke:#222222;stroke-width:1;"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="335.3924" x="87.1312" y="127.868"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="315.3924" x="97.1312" y="151.756">Create BoundedChannel<LogEntry> log_channel</text><path d="M378.2758,176.096 L378.2758,213.552 L358.2758,217.552 L378.2758,221.552 L378.2758,259.008 A0,0 0 0 0 378.2758,259.008 L721.3779,259.008 A0,0 0 0 0 721.3779,259.008 L721.3779,186.096 L711.3779,176.096 L378.2758,176.096 A0,0 0 0 0 378.2758,176.096" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M711.3779,176.096 L711.3779,186.096 L721.3779,186.096 L711.3779,176.096" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="290.791" x="384.2758" y="194.984">The only concurrency in the current pipeline:</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="279.6993" x="384.2758" y="213.212">a dedicated thread drains log_channel and</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="287.8688" x="384.2758" y="231.44">forwards entries to spdlog for the entire run.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="322.1021" x="384.2758" y="249.668">Joined during shutdown after log_channel closes.</text><rect fill="#FAFCF9" height="56.456" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="206.8969" x="151.379" y="189.324"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="186.8969" x="161.379" y="213.212">Spawn log dispatcher thread</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.4392" x="161.379" y="231.44">(LogDispatcher::Run())</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="200.4815" x="154.5866" y="279.008"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="180.4815" x="164.5866" y="302.896">ParseArguments(argc, argv)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="158.5409" x="175.5569" y="388.35"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="138.5409" x="185.5569" y="412.238">Log error / usage info</text><ellipse cx="254.8274" cy="463.964" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1;"/><ellipse cx="254.8274" cy="463.964" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1;"/><polygon fill="#FAFCF9" points="186.2972,337.236,323.3575,337.236,335.3575,349.236,323.3575,361.236,186.2972,361.236,174.2972,349.236,186.2972,337.236" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="258.8274" y="375.124">no</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="137.0603" x="186.2972" y="354.01">Are arguments valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="335.3575" y="344.896">yes</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="329.3164" x="90.1692" y="516.964"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="309.3164" x="100.1692" y="540.852">Init OpenSSL global state & LlamaBackendState</text><path d="M350.1234,565.192 L350.1234,593.534 L330.1234,597.534 L350.1234,601.534 L350.1234,629.876 A0,0 0 0 0 350.1234,629.876 L706.389,629.876 A0,0 0 0 0 706.389,629.876 L706.389,575.192 L696.389,565.192 L350.1234,565.192 A0,0 0 0 0 350.1234,565.192" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M696.389,565.192 L696.389,575.192 L706.389,575.192 L696.389,565.192" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="324.4892" x="356.1234" y="584.08">Binds ILogger, IEnrichmentService, DataGenerator,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="335.2655" x="356.1234" y="602.308">IExportService, IPromptFormatter, WebClient based</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="252.8225" x="356.1234" y="620.536">on --mocked vs. model-backed mode.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="150.5921" x="179.5313" y="578.42"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="130.5921" x="189.5313" y="602.308">di::make_injector(...)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="457.6548" x="26" y="649.876"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="437.6548" x="36" y="673.764">injector.create<std::unique_ptr<BiergartenPipelineOrchestrator>>()</text><path d="M406.0361,703.99 L406.0361,723.218 L386.0361,727.218 L406.0361,731.218 L406.0361,750.446 A0,0 0 0 0 406.0361,750.446 L760.0757,750.446 A0,0 0 0 0 760.0757,750.446 L760.0757,713.99 L750.0757,703.99 L406.0361,703.99 A0,0 0 0 0 406.0361,703.99" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M750.0757,703.99 L750.0757,713.99 L760.0757,713.99 L750.0757,703.99" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="333.0396" x="412.0361" y="722.878">Run() itself is synchronous — sampling, enrichment,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="314.5316" x="412.0361" y="741.106">generation, and export all happen on this thread.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="262.4174" x="123.6187" y="708.104"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="242.4174" x="133.6187" y="731.992">BiergartenPipelineOrchestrator::Run()</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="139.4621" x="185.0963" y="4479.036"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="119.4621" x="195.0963" y="4502.924">Close log_channel</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="190.3838" x="159.6355" y="4537.264"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="170.3838" x="169.6355" y="4561.152">Join log dispatcher thread</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="76.287" x="216.6839" y="4595.492"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="56.287" x="226.6839" y="4619.38">Return 0</text><ellipse cx="254.8274" cy="4664.72" fill="none" rx="11" ry="11" style="stroke:#222222;stroke-width:1;"/><ellipse cx="254.8274" cy="4664.72" fill="#222222" rx="6" ry="6" style="stroke:#222222;stroke-width:1;"/><line style="stroke:#547461;stroke-width:0.3;" x1="20" x2="20" y1="64.64" y2="4675.72"/><rect fill="#EAF0E8" height="4611.08" style="stroke:#EAF0E8;stroke-width:1;" width="1147.4065" x="765.0757" y="64.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="165.1697" x="1093.6321" y="770.446"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.1697" x="1103.6321" y="794.334">Initialize SQLite export</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="201.2686" x="1075.5826" y="998.042"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="181.2686" x="1085.5826" y="1021.93">QueryCitiesWithCountries()</text><polygon fill="#FAFCF9" points="1128.9773,1340.026,1223.4565,1340.026,1235.4565,1352.026,1223.4565,1364.026,1128.9773,1364.026,1116.9773,1352.026,1128.9773,1340.026" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="94.4791" x="1128.9773" y="1356.8">Lookup failed?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1094.2028" y="1347.686">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1235.4565" y="1347.686">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="158.7404" x="967.7944" y="1374.026"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="138.7404" x="977.7944" y="1397.914">Log warning, skip city</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="317.469" x="1146.5348" y="1374.026"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="297.469" x="1156.5348" y="1397.914">Store EnrichedCity{Location, region_context}</text><polygon fill="#FAFCF9" points="1176.2169,1418.254,1188.2169,1430.254,1176.2169,1442.254,1164.2169,1430.254,1176.2169,1418.254" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="1084.5553,1172.726,1267.8785,1172.726,1279.8785,1184.726,1267.8785,1196.726,1084.5553,1196.726,1072.5553,1184.726,1084.5553,1172.726" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.8471" x="1180.2169" y="1210.614">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.3233" x="1084.5553" y="1189.5">For each sampled Location?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="1038.6333" y="1180.386">Done</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="229.3142" x="1061.5598" y="1484.254"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="209.3142" x="1071.5598" y="1508.142">GenerateUsers(enriched_cities)</text><rect fill="#FAFCF9" height="56.456" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="305.6703" x="1023.3818" y="1811.238"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="248.7066" x="1033.3818" y="1835.126">SampleName(forenames_by_country,</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="278.2223" x="1040.8298" y="1853.354">surnames_by_country, location.iso3166_1)</text><polygon fill="#FAFCF9" points="1081.7867,1887.694,1270.6471,1887.694,1282.6471,1899.694,1270.6471,1911.694,1081.7867,1911.694,1069.7867,1899.694,1081.7867,1887.694" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.8604" x="1081.7867" y="1904.468">Names available for country?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1053.4522" y="1895.354">no</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1282.6471" y="1895.354">yes</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="158.7404" x="817.4483" y="1931.694"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="138.7404" x="827.4483" y="1955.582">Log warning, skip city</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="271.7518" x="1319.7395" y="1931.694"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="251.7518" x="1329.7395" y="1955.582">Sample UserPersona (uniform random)</text><polygon fill="#FAFCF9" points="1379.331,2526.062,1531.8998,2526.062,1543.8998,2538.062,1531.8998,2550.062,1379.331,2550.062,1367.331,2538.062,1379.331,2526.062" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="152.5688" x="1379.331" y="2542.836">Generation successful?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1344.5565" y="2533.722">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1543.8998" y="2533.722">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="297.284" x="1028.2909" y="2570.062"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="277.284" x="1038.2909" y="2593.95">BuildEmail(name, used_email_local_parts)</text><path d="M1291.4476,2624.176 L1291.4476,2643.404 L1271.4476,2647.404 L1291.4476,2651.404 L1291.4476,2670.632 A0,0 0 0 0 1291.4476,2670.632 L1569.1135,2670.632 A0,0 0 0 0 1569.1135,2670.632 L1569.1135,2634.176 L1559.1135,2624.176 L1291.4476,2624.176 A0,0 0 0 0 1291.4476,2624.176" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M1559.1135,2624.176 L1559.1135,2634.176 L1569.1135,2634.176 L1559.1135,2624.176" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="253.5787" x="1297.4476" y="2643.064">email and date_of_birth are generated</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="256.6659" x="1297.4476" y="2661.292">programmatically, never LLM-authored.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="189.0293" x="1082.4183" y="2628.29"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="169.0293" x="1092.4183" y="2652.178">GenerateDateOfBirth(rng)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="238.5615" x="1057.6522" y="2980.43"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="218.5615" x="1067.6522" y="3004.318">Log warning "SQLite export failed"</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="290.3687" x="1589.1135" y="2570.062"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="270.3687" x="1599.1135" y="2593.95">Log warning "Generation failed, skipping..."</text><polygon fill="#FAFCF9" points="1455.6154,3072.658,1467.6154,3084.658,1455.6154,3096.658,1443.6154,3084.658,1455.6154,3072.658" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="1176.2169,3106.658,1188.2169,3118.658,1176.2169,3130.658,1164.2169,3118.658,1176.2169,3106.658" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="1100.5695,1751.85,1251.8643,1751.85,1263.8643,1763.85,1251.8643,1775.85,1100.5695,1775.85,1088.5695,1763.85,1100.5695,1751.85" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.8471" x="1180.2169" y="1789.738">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="151.2948" x="1100.5695" y="1768.624">For each EnrichedCity?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="1054.6476" y="1759.51">Done</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="256.6633" x="1047.8853" y="3172.658"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="236.6633" x="1057.8853" y="3196.546">GenerateBreweries(enriched_cities)</text><polygon fill="#FAFCF9" points="1099.9325,3916.44,1252.5013,3916.44,1264.5013,3928.44,1252.5013,3940.44,1099.9325,3940.44,1087.9325,3928.44,1099.9325,3916.44" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="152.5688" x="1099.9325" y="3933.214">Generation successful?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1065.158" y="3924.1">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1264.5013" y="3924.1">no</text><path d="M1029.6372,4250.238 L1029.6372,4269.466 L1009.6372,4273.466 L1029.6372,4277.466 L1029.6372,4296.694 A0,0 0 0 0 1029.6372,4296.694 L1274.893,4296.694 A0,0 0 0 0 1274.893,4296.694 L1274.893,4260.238 L1264.893,4250.238 L1029.6372,4250.238 A0,0 0 0 0 1029.6372,4250.238" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M1264.893,4250.238 L1264.893,4260.238 L1274.893,4260.238 L1264.893,4250.238" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="224.2558" x="1035.6372" y="4269.126">Data loss is prevented per-record.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="201.7788" x="1035.6372" y="4287.354">The pipeline continues running.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="238.5615" x="771.0757" y="4254.352"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="218.5615" x="781.0757" y="4278.24">Log warning "SQLite export failed"</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="290.3687" x="1316.893" y="3960.44"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="270.3687" x="1326.893" y="3984.328">Log warning "Generation failed, skipping..."</text><polygon fill="#FAFCF9" points="1176.2169,4350.694,1188.2169,4362.694,1176.2169,4374.694,1164.2169,4362.694,1176.2169,4350.694" style="stroke:#628A5B;stroke-width:0.5;"/><line style="stroke:#547461;stroke-width:0.3;" x1="765.0757" x2="765.0757" y1="64.64" y2="4675.72"/><rect fill="#E0EAE0" height="4611.08" style="stroke:#E0EAE0;stroke-width:1;" width="950.6377" x="1912.4822" y="64.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="353.7568" x="2188.2086" y="828.674"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="333.7568" x="2198.2086" y="852.562">GetUtcTimestamp() from SystemDateTimeProvider</text><path d="M2426.2791,876.902 L2426.2791,923.472 L2406.2791,927.472 L2426.2791,931.472 L2426.2791,978.042 A0,0 0 0 0 2426.2791,978.042 L2858.1199,978.042 A0,0 0 0 0 2858.1199,978.042 L2858.1199,886.902 L2848.1199,876.902 L2426.2791,876.902 A0,0 0 0 0 2426.2791,876.902" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M2848.1199,876.902 L2848.1199,886.902 L2858.1199,886.902 L2848.1199,876.902" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="410.8409" x="2432.2791" y="895.79">Builds a fresh biergarten_seed_<UTC datetime>.sqlite filename</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="370.0484" x="2432.2791" y="914.018">Appends a numeric suffix if the timestamp already exists</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="143.689" x="2432.2791" y="932.246">Opens DB Connection</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.6175" x="2432.2791" y="950.474">Executes Schema DDL</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.8503" x="2432.2791" y="968.702">Begins Transaction</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="82.3841" x="2323.8949" y="908.358"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="62.3841" x="2333.8949" y="932.246">Initialize()</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="204.4783" x="2263.5639" y="2690.632"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="184.4783" x="2273.5639" y="2714.52">ProcessRecord(UserRecord)</text><polygon fill="#FAFCF9" points="2304.6737,2748.86,2426.9324,2748.86,2438.9324,2760.86,2426.9324,2772.86,2304.6737,2772.86,2292.6737,2760.86,2304.6737,2748.86" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.2587" x="2304.6737" y="2765.634">Location in cache?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="2269.8992" y="2756.52">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="2438.9324" y="2756.52">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="136.6096" x="2205.0587" y="2782.86"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="116.6096" x="2215.0587" y="2806.748">Reuse location_id</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="193.1487" x="2361.6682" y="2782.86"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="173.1487" x="2371.6682" y="2806.748">Insert Location & Cache ID</text><polygon fill="#FAFCF9" points="2365.803,2827.088,2377.803,2839.088,2365.803,2851.088,2353.803,2839.088,2365.803,2827.088" style="stroke:#628A5B;stroke-width:0.5;"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="199.9807" x="2265.8127" y="2871.088"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="179.9807" x="2275.8127" y="2894.976">Insert User (FK: location_id)</text><polygon fill="#FAFCF9" points="2262.5773,2929.316,2469.0287,2929.316,2481.0287,2941.316,2469.0287,2953.316,2262.5773,2953.316,2250.5773,2941.316,2262.5773,2929.316" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="2369.803" y="2967.204">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="206.4514" x="2262.5773" y="2946.09">Exception caught during insert?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="2481.0287" y="2936.976">no</text><polygon fill="#FAFCF9" points="2365.803,3038.658,2377.803,3050.658,2365.803,3062.658,2353.803,3050.658,2365.803,3038.658" style="stroke:#628A5B;stroke-width:0.5;"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="251.3364" x="1953.5583" y="3960.44"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="231.3364" x="1963.5583" y="3984.328">ProcessRecord(GeneratedBrewery)</text><polygon fill="#FAFCF9" points="2018.0972,4018.668,2140.3559,4018.668,2152.3559,4030.668,2140.3559,4042.668,2018.0972,4042.668,2006.0972,4030.668,2018.0972,4018.668" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.2587" x="2018.0972" y="4035.442">Location in cache?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1983.3227" y="4026.328">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="2152.3559" y="4026.328">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="136.6096" x="1918.4822" y="4052.668"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="116.6096" x="1928.4822" y="4076.556">Reuse location_id</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="193.1487" x="2075.0917" y="4052.668"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="173.1487" x="2085.0917" y="4076.556">Insert Location & Cache ID</text><polygon fill="#FAFCF9" points="2079.2265,4096.896,2091.2265,4108.896,2079.2265,4120.896,2067.2265,4108.896,2079.2265,4096.896" style="stroke:#628A5B;stroke-width:0.5;"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="223.8088" x="1967.3221" y="4140.896"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="203.8088" x="1977.3221" y="4164.784">Insert Brewery (FK: location_id)</text><polygon fill="#FAFCF9" points="1976.0008,4199.124,2182.4522,4199.124,2194.4522,4211.124,2182.4522,4223.124,1976.0008,4223.124,1964.0008,4211.124,1976.0008,4199.124" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="2083.2265" y="4237.012">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="206.4514" x="1976.0008" y="4215.898">Exception caught during insert?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="2194.4522" y="4206.784">no</text><polygon fill="#FAFCF9" points="2079.2265,4316.694,2091.2265,4328.694,2079.2265,4340.694,2067.2265,4328.694,2079.2265,4316.694" style="stroke:#628A5B;stroke-width:0.5;"/><path d="M2423.9725,4412.58 L2423.9725,4431.808 L2403.9725,4435.808 L2423.9725,4439.808 L2423.9725,4459.036 A0,0 0 0 0 2423.9725,4459.036 L2633.1782,4459.036 A0,0 0 0 0 2633.1782,4459.036 L2633.1782,4422.58 L2623.1782,4412.58 L2423.9725,4412.58 A0,0 0 0 0 2423.9725,4412.58" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M2623.1782,4412.58 L2623.1782,4422.58 L2633.1782,4422.58 L2623.1782,4412.58" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="139.3947" x="2429.9725" y="4431.468">Commits Transaction</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.2056" x="2429.9725" y="4449.696">Closes Database Connection</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="77.7711" x="2326.2014" y="4416.694"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="57.7711" x="2336.2014" y="4440.582">Finalize()</text><line style="stroke:#547461;stroke-width:0.3;" x1="1912.4822" x2="1912.4822" y1="64.64" y2="4675.72"/><rect fill="#E2EBDC" height="4611.08" style="stroke:#E2EBDC;stroke-width:1;" width="748.6874" x="2863.1199" y="64.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="304.169" x="2913.5962" y="1056.27"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="284.169" x="2923.5962" y="1080.158">JsonLoader::LoadLocations("locations.json")</text><path d="M3263.2032,1119.498 L3263.2032,1129.612 L3243.2032,1133.612 L3263.2032,1137.612 L3263.2032,1147.726 A0,0 0 0 0 3263.2032,1147.726 L3491.4526,1147.726 A0,0 0 0 0 3491.4526,1147.726 L3491.4526,1129.498 L3481.4526,1119.498 L3263.2032,1119.498 A0,0 0 0 0 3263.2032,1119.498" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3481.4526,1119.498 L3481.4526,1129.498 L3491.4526,1129.498 L3481.4526,1119.498" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="207.2494" x="3269.2032" y="1138.386">--location-count defaults to 10.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="355.045" x="2888.1582" y="1114.498"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="335.045" x="2898.1582" y="1138.386">std::ranges::sample(all_locations, --location-count)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="219.3674" x="2955.997" y="1542.482"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="199.3674" x="2965.997" y="1566.37">LoadPersonas("personas.json")</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="393.1216" x="2869.1199" y="1600.71"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="373.1216" x="2879.1199" y="1624.598">LoadForenamesByCountry("forenames-by-country.json")</text><path d="M3275.455,1648.938 L3275.455,1686.394 L3255.455,1690.394 L3275.455,1694.394 L3275.455,1731.85 A0,0 0 0 0 3275.455,1731.85 L3606.8073,1731.85 A0,0 0 0 0 3606.8073,1731.85 L3606.8073,1658.938 L3596.8073,1648.938 L3275.455,1648.938 A0,0 0 0 0 3275.455,1648.938" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3596.8073,1648.938 L3596.8073,1658.938 L3606.8073,1658.938 L3596.8073,1648.938" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="250.3066" x="3281.455" y="1667.826">Each call is cached after its first parse.</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="310.3523" x="3281.455" y="1686.054">MockCuratedDataService (--mocked) returns a</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="279.4402" x="3281.455" y="1704.282">fixed in-memory dataset instead and skips</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="199.4863" x="3281.455" y="1722.51">these three JSON files entirely.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="379.5485" x="2875.9064" y="1671.28"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="359.5485" x="2885.9064" y="1695.168">LoadSurnamesByCountry("surnames-by-country.json")</text><line style="stroke:#547461;stroke-width:0.3;" x1="2863.1199" x2="2863.1199" y1="64.64" y2="4675.72"/><rect fill="#DCE8D8" height="4611.08" style="stroke:#DCE8D8;stroke-width:1;" width="611.4314" x="3611.8073" y="64.64"/><path d="M3820.4455,1222.114 L3820.4455,1259.57 L3800.4455,1263.57 L3820.4455,1267.57 L3820.4455,1305.026 A0,0 0 0 0 3820.4455,1305.026 L4218.2387,1305.026 A0,0 0 0 0 4218.2387,1305.026 L4218.2387,1232.114 L4208.2387,1222.114 L3820.4455,1222.114 A0,0 0 0 0 3820.4455,1222.114" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M4208.2387,1222.114 L4208.2387,1232.114 L4218.2387,1232.114 L4208.2387,1222.114" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="302.502" x="3826.4455" y="1241.002">WikipediaEnrichmentService fetches a generic</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="323.5059" x="3826.4455" y="1259.23">"brewing" extract and a "beer in {country}" extract</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="376.7932" x="3826.4455" y="1277.458">(not a city/region-specific page). MockEnrichmentService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="289.6849" x="3826.4455" y="1295.686">(--mocked) returns an empty string instead.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="182.6382" x="3617.8073" y="1244.456"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="162.6382" x="3627.8073" y="1268.344">GetLocationContext(loc)</text><line style="stroke:#547461;stroke-width:0.3;" x1="3611.8073" x2="3611.8073" y1="64.64" y2="4675.72"/><rect fill="#E5EDE1" height="4611.08" style="stroke:#E5EDE1;stroke-width:1;" width="1376.5982" x="4223.2387" y="64.64"/><polygon fill="#FAFCF9" points="4775.7287,1989.922,4882.5908,1989.922,4894.5908,2001.922,4882.5908,2013.922,4775.7287,2013.922,4763.7287,2001.922,4775.7287,1989.922" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="106.8621" x="4775.7287" y="2006.696">Generator Mode</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="101.4686" x="4662.26" y="1997.582">MockGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="104.5242" x="4894.5908" y="1997.582">LlamaGenerator</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="203.7782" x="4541.5942" y="2023.922"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.7782" x="4551.5942" y="2047.81">DeterministicHash & Format</text><path d="M5205.6052,2028.922 L5205.6052,2039.036 L5185.6052,2043.036 L5205.6052,2047.036 L5205.6052,2057.15 A0,0 0 0 0 5205.6052,2057.15 L5594.8369,2057.15 A0,0 0 0 0 5594.8369,2057.15 L5594.8369,2038.922 L5584.8369,2028.922 L5205.6052,2028.922 A0,0 0 0 0 5205.6052,2028.922" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M5584.8369,2028.922 L5584.8369,2038.922 L5594.8369,2038.922 L5584.8369,2028.922" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="368.2317" x="5211.6052" y="2047.81">Resolves to USER_GENERATION.md inside --prompt-dir.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="341.5381" x="4844.0671" y="2023.922"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="321.5381" x="4854.0671" y="2047.81">prompt_directory_->Load("USER_GENERATION")</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="478.9275" x="4775.3724" y="2126.15"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="458.9275" x="4785.3724" y="2150.038">Infer(system_prompt, user_prompt, max_tokens, kUserJsonGrammar)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="201.3739" x="4914.1492" y="2184.378"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="181.3739" x="4924.1492" y="2208.266">ValidateUserJson(raw, user)</text><polygon fill="#FAFCF9" points="4968.3596,2242.606,5061.3127,2242.606,5073.3127,2254.606,5061.3127,2266.606,4968.3596,2266.606,4956.3596,2254.606,4968.3596,2242.606" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="92.9531" x="4968.3596" y="2259.38">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="4933.5851" y="2250.266">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="5073.3127" y="2250.266">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="90.3536" x="5057.011" y="2276.606"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="70.3536" x="5067.011" y="2300.494">Attempt++</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="279.4065" x="4962.4846" y="2334.834"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="259.4065" x="4972.4846" y="2358.722">Append validation error to retry prompt</text><polygon fill="#FAFCF9" points="5014.8362,2082.15,5026.8362,2094.15,5014.8362,2106.15,5002.8362,2094.15,5014.8362,2082.15" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4971.9874,2393.062,5057.685,2393.062,5069.685,2405.062,5057.685,2417.062,4971.9874,2417.062,4959.9874,2405.062,4971.9874,2393.062" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="85.6976" x="4971.9874" y="2409.836">Attempt < 3?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="5069.685" y="2400.722">yes</text><polygon fill="#FAFCF9" points="5014.8362,2452.062,5026.8362,2464.062,5014.8362,2476.062,5002.8362,2464.062,5014.8362,2452.062" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4829.1597,2482.062,4841.1597,2494.062,4829.1597,2506.062,4817.1597,2494.062,4829.1597,2482.062" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4496.3302,3290.274,4603.1923,3290.274,4615.1923,3302.274,4603.1923,3314.274,4496.3302,3314.274,4484.3302,3302.274,4496.3302,3290.274" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="106.8621" x="4496.3302" y="3307.048">Generator Mode</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="101.4686" x="4382.8616" y="3297.934">MockGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="104.5242" x="4615.1923" y="3297.934">LlamaGenerator</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="203.7782" x="4256.2387" y="3324.274"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.7782" x="4266.2387" y="3348.162">DeterministicHash & Format</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="166.7972" x="4657.9961" y="3324.274"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="146.7972" x="4667.9961" y="3348.162">PrepareRegionContext</text><path d="M4946.6836,3387.502 L4946.6836,3397.616 L4926.6836,3401.616 L4946.6836,3405.616 L4946.6836,3415.73 A0,0 0 0 0 4946.6836,3415.73 L5364.9548,3415.73 A0,0 0 0 0 5364.9548,3415.73 L5364.9548,3397.502 L5354.9548,3387.502 L4946.6836,3387.502 A0,0 0 0 0 4946.6836,3387.502" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M5354.9548,3387.502 L5354.9548,3397.502 L5364.9548,3397.502 L5354.9548,3387.502" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="397.2713" x="4952.6836" y="3406.39">Resolves to BREWERY_GENERATION.md inside --prompt-dir.</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="370.5777" x="4556.1059" y="3382.502"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="350.5777" x="4566.1059" y="3406.39">prompt_directory_->Load("BREWERY_GENERATION")</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="502.7556" x="4490.0169" y="3484.73"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="482.7556" x="4500.0169" y="3508.618">Infer(system_prompt, user_prompt, max_tokens, kBreweryJsonGrammar)</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="250.5106" x="4616.1394" y="3542.958"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="230.5106" x="4626.1394" y="3566.846">ValidateBreweryJson(raw, brewery)</text><path d="M4799.8713,3591.186 L4799.8713,3637.642 L5059.344,3637.642 L5059.344,3601.186 L5049.344,3591.186 L4799.8713,3591.186" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M5049.344,3591.186 L5049.344,3601.186 L5059.344,3601.186 L5049.344,3591.186" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="238.4728" x="4805.8713" y="3610.074">max_tokens is fixed across retries —</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="186.1969" x="4805.8713" y="3628.302">it is not raised on truncation.</text><polygon fill="#FAFCF9" points="4694.9182,3637.642,4787.8713,3637.642,4799.8713,3649.642,4787.8713,3661.642,4694.9182,3661.642,4682.9182,3649.642,4694.9182,3637.642" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="92.9531" x="4694.9182" y="3654.416">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="4660.1437" y="3645.302">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="4799.8713" y="3645.302">no</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="90.3536" x="4783.5696" y="3671.642"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="70.3536" x="4793.5696" y="3695.53">Attempt++</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="279.4065" x="4689.0431" y="3729.87"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="259.4065" x="4699.0431" y="3753.758">Append validation error to retry prompt</text><polygon fill="#FAFCF9" points="4741.3947,3440.73,4753.3947,3452.73,4741.3947,3464.73,4729.3947,3452.73,4741.3947,3440.73" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4698.5459,3798.44,4784.2435,3798.44,4796.2435,3810.44,4784.2435,3822.44,4698.5459,3822.44,4686.5459,3810.44,4698.5459,3798.44" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="85.6976" x="4698.5459" y="3815.214">Attempt < 3?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="4796.2435" y="3806.1">yes</text><polygon fill="#FAFCF9" points="4741.3947,3842.44,4753.3947,3854.44,4741.3947,3866.44,4729.3947,3854.44,4741.3947,3842.44" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4549.7613,3872.44,4561.7613,3884.44,4549.7613,3896.44,4537.7613,3884.44,4549.7613,3872.44" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4474.1139,3230.886,4625.4086,3230.886,4637.4086,3242.886,4625.4086,3254.886,4474.1139,3254.886,4462.1139,3242.886,4474.1139,3230.886" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="105.8471" x="4553.7613" y="3268.774">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="151.2948" x="4474.1139" y="3247.66">For each EnrichedCity?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="4428.1919" y="3238.546">Done</text><line style="stroke:#547461;stroke-width:0.3;" x1="4223.2387" x2="4223.2387" y1="64.64" y2="4675.72"/><line style="stroke:#547461;stroke-width:0.3;" x1="5599.8369" x2="5599.8369" y1="64.64" y2="4675.72"/><polygon fill="#628A5B" points="5382.9548,3788.098,5386.9548,3778.098,5390.9548,3788.098" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="107.868" y2="127.868"/><polygon fill="#628A5B" points="250.8274,117.868,258.8274,117.868,254.8274,127.868" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="166.096" y2="189.324"/><polygon fill="#628A5B" points="250.8274,179.324,258.8274,179.324,254.8274,189.324" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="245.78" y2="279.008"/><polygon fill="#628A5B" points="250.8274,269.008,258.8274,269.008,254.8274,279.008" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="426.578" y2="452.964"/><polygon fill="#628A5B" points="250.8274,442.964,258.8274,442.964,254.8274,452.964" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="361.236" y2="388.35"/><polygon fill="#628A5B" points="250.8274,378.35,258.8274,378.35,254.8274,388.35" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="335.3575" x2="347.3575" y1="349.236" y2="349.236"/><polygon fill="#628A5B" points="343.3575,422.964,351.3575,422.964,347.3575,432.964" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="347.3575" x2="347.3575" y1="349.236" y2="496.964"/><line style="stroke:#628A5B;stroke-width:1;" x1="347.3575" x2="254.8274" y1="496.964" y2="496.964"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="496.964" y2="516.964"/><polygon fill="#628A5B" points="250.8274,506.964,258.8274,506.964,254.8274,516.964" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="317.236" y2="337.236"/><polygon fill="#628A5B" points="250.8274,327.236,258.8274,327.236,254.8274,337.236" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="555.192" y2="578.42"/><polygon fill="#628A5B" points="250.8274,568.42,258.8274,568.42,254.8274,578.42" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="616.648" y2="649.876"/><polygon fill="#628A5B" points="250.8274,639.876,258.8274,639.876,254.8274,649.876" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="688.104" y2="708.104"/><polygon fill="#628A5B" points="250.8274,698.104,258.8274,698.104,254.8274,708.104" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="4517.264" y2="4537.264"/><polygon fill="#628A5B" points="250.8274,4527.264,258.8274,4527.264,254.8274,4537.264" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="4575.492" y2="4595.492"/><polygon fill="#628A5B" points="250.8274,4585.492,258.8274,4585.492,254.8274,4595.492" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="4633.72" y2="4653.72"/><polygon fill="#628A5B" points="250.8274,4643.72,258.8274,4643.72,254.8274,4653.72" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1116.9773" x2="1047.1646" y1="1352.026" y2="1352.026"/><line style="stroke:#628A5B;stroke-width:1;" x1="1047.1646" x2="1047.1646" y1="1352.026" y2="1374.026"/><polygon fill="#628A5B" points="1043.1646,1364.026,1051.1646,1364.026,1047.1646,1374.026" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1235.4565" x2="1305.2693" y1="1352.026" y2="1352.026"/><line style="stroke:#628A5B;stroke-width:1;" x1="1305.2693" x2="1305.2693" y1="1352.026" y2="1374.026"/><polygon fill="#628A5B" points="1301.2693,1364.026,1309.2693,1364.026,1305.2693,1374.026" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1047.1646" x2="1047.1646" y1="1412.254" y2="1430.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1047.1646" x2="1164.2169" y1="1430.254" y2="1430.254"/><polygon fill="#628A5B" points="1154.2169,1426.254,1164.2169,1430.254,1154.2169,1434.254" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1305.2693" x2="1305.2693" y1="1412.254" y2="1430.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1305.2693" x2="1188.2169" y1="1430.254" y2="1430.254"/><polygon fill="#628A5B" points="1198.2169,1426.254,1188.2169,1430.254,1198.2169,1434.254" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1442.254" y2="1452.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1697.3292" y1="1452.254" y2="1452.254"/><polygon fill="#628A5B" points="1693.3292,1321.07,1697.3292,1311.07,1701.3292,1321.07" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1697.3292" x2="1697.3292" y1="1184.726" y2="1452.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1697.3292" x2="1279.8785" y1="1184.726" y2="1184.726"/><polygon fill="#628A5B" points="1289.8785,1180.726,1279.8785,1184.726,1289.8785,1188.726" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1072.5553" x2="945.7944" y1="1184.726" y2="1184.726"/><polygon fill="#628A5B" points="941.7944,1307.07,949.7944,1307.07,945.7944,1317.07" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="945.7944" x2="945.7944" y1="1184.726" y2="1464.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="945.7944" x2="1176.2169" y1="1464.254" y2="1464.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1464.254" y2="1484.254"/><polygon fill="#628A5B" points="1172.2169,1474.254,1180.2169,1474.254,1176.2169,1484.254" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.933" x2="1176.933" y1="2608.29" y2="2628.29"/><polygon fill="#628A5B" points="1172.933,2618.29,1180.933,2618.29,1176.933,2628.29" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1367.331" x2="1176.933" y1="2538.062" y2="2538.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.933" x2="1176.933" y1="2538.062" y2="2570.062"/><polygon fill="#628A5B" points="1172.933,2560.062,1180.933,2560.062,1176.933,2570.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1543.8998" x2="1734.2978" y1="2538.062" y2="2538.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="1734.2978" x2="1734.2978" y1="2538.062" y2="2570.062"/><polygon fill="#628A5B" points="1730.2978,2560.062,1738.2978,2560.062,1734.2978,2570.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1734.2978" x2="1734.2978" y1="2608.29" y2="3084.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1734.2978" x2="1467.6154" y1="3084.658" y2="3084.658"/><polygon fill="#628A5B" points="1477.6154,3080.658,1467.6154,3084.658,1477.6154,3088.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1069.7867" x2="896.8184" y1="1899.694" y2="1899.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="896.8184" x2="896.8184" y1="1899.694" y2="1931.694"/><polygon fill="#628A5B" points="892.8184,1921.694,900.8184,1921.694,896.8184,1931.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1282.6471" x2="1455.6154" y1="1899.694" y2="1899.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="1455.6154" x2="1455.6154" y1="1899.694" y2="1931.694"/><polygon fill="#628A5B" points="1451.6154,1921.694,1459.6154,1921.694,1455.6154,1931.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="896.8184" x2="896.8184" y1="1969.922" y2="3118.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="896.8184" x2="1164.2169" y1="3118.658" y2="3118.658"/><polygon fill="#628A5B" points="1154.2169,3114.658,1164.2169,3118.658,1154.2169,3122.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1455.6154" x2="1455.6154" y1="3096.658" y2="3118.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1455.6154" x2="1188.2169" y1="3118.658" y2="3118.658"/><polygon fill="#628A5B" points="1198.2169,3114.658,1188.2169,3118.658,1198.2169,3122.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1867.694" y2="1887.694"/><polygon fill="#628A5B" points="1172.2169,1877.694,1180.2169,1877.694,1176.2169,1887.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1775.85" y2="1811.238"/><polygon fill="#628A5B" points="1172.2169,1801.238,1180.2169,1801.238,1176.2169,1811.238" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="3130.658" y2="3140.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1893.4822" y1="3140.658" y2="3140.658"/><polygon fill="#628A5B" points="1889.4822,2434.448,1893.4822,2424.448,1897.4822,2434.448" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1893.4822" x2="1893.4822" y1="1763.85" y2="3140.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1893.4822" x2="1263.8643" y1="1763.85" y2="1763.85"/><polygon fill="#628A5B" points="1273.8643,1759.85,1263.8643,1763.85,1273.8643,1767.85" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1088.5695" x2="795.4483" y1="1763.85" y2="1763.85"/><polygon fill="#628A5B" points="791.4483,2420.448,799.4483,2420.448,795.4483,2430.448" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="795.4483" x2="795.4483" y1="1763.85" y2="3152.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="795.4483" x2="1176.2169" y1="3152.658" y2="3152.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="3152.658" y2="3172.658"/><polygon fill="#628A5B" points="1172.2169,3162.658,1180.2169,3162.658,1176.2169,3172.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1264.5013" x2="1462.0774" y1="3928.44" y2="3928.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="1462.0774" x2="1462.0774" y1="3928.44" y2="3960.44"/><polygon fill="#628A5B" points="1458.0774,3950.44,1466.0774,3950.44,1462.0774,3960.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1462.0774" x2="1462.0774" y1="3998.668" y2="4362.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="1462.0774" x2="1188.2169" y1="4362.694" y2="4362.694"/><polygon fill="#628A5B" points="1198.2169,4358.694,1188.2169,4362.694,1198.2169,4366.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.087" x2="2365.087" y1="866.902" y2="908.358"/><polygon fill="#628A5B" points="2361.087,898.358,2369.087,898.358,2365.087,908.358" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2292.6737" x2="2273.3635" y1="2760.86" y2="2760.86"/><line style="stroke:#628A5B;stroke-width:1;" x1="2273.3635" x2="2273.3635" y1="2760.86" y2="2782.86"/><polygon fill="#628A5B" points="2269.3635,2772.86,2277.3635,2772.86,2273.3635,2782.86" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2438.9324" x2="2458.2426" y1="2760.86" y2="2760.86"/><line style="stroke:#628A5B;stroke-width:1;" x1="2458.2426" x2="2458.2426" y1="2760.86" y2="2782.86"/><polygon fill="#628A5B" points="2454.2426,2772.86,2462.2426,2772.86,2458.2426,2782.86" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2273.3635" x2="2273.3635" y1="2821.088" y2="2839.088"/><line style="stroke:#628A5B;stroke-width:1;" x1="2273.3635" x2="2353.803" y1="2839.088" y2="2839.088"/><polygon fill="#628A5B" points="2343.803,2835.088,2353.803,2839.088,2343.803,2843.088" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2458.2426" x2="2458.2426" y1="2821.088" y2="2839.088"/><line style="stroke:#628A5B;stroke-width:1;" x1="2458.2426" x2="2377.803" y1="2839.088" y2="2839.088"/><polygon fill="#628A5B" points="2387.803,2835.088,2377.803,2839.088,2387.803,2843.088" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.803" x2="2365.803" y1="2728.86" y2="2748.86"/><polygon fill="#628A5B" points="2361.803,2738.86,2369.803,2738.86,2365.803,2748.86" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.803" x2="2365.803" y1="2851.088" y2="2871.088"/><polygon fill="#628A5B" points="2361.803,2861.088,2369.803,2861.088,2365.803,2871.088" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2481.0287" x2="2495.0838" y1="2941.316" y2="2941.316"/><polygon fill="#628A5B" points="2491.0838,2989.544,2499.0838,2989.544,2495.0838,2999.544" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2495.0838" x2="2495.0838" y1="2941.316" y2="3050.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="2495.0838" x2="2377.803" y1="3050.658" y2="3050.658"/><polygon fill="#628A5B" points="2387.803,3046.658,2377.803,3050.658,2387.803,3054.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.803" x2="2365.803" y1="2909.316" y2="2929.316"/><polygon fill="#628A5B" points="2361.803,2919.316,2369.803,2919.316,2365.803,2929.316" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2006.0972" x2="1986.787" y1="4030.668" y2="4030.668"/><line style="stroke:#628A5B;stroke-width:1;" x1="1986.787" x2="1986.787" y1="4030.668" y2="4052.668"/><polygon fill="#628A5B" points="1982.787,4042.668,1990.787,4042.668,1986.787,4052.668" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2152.3559" x2="2171.6661" y1="4030.668" y2="4030.668"/><line style="stroke:#628A5B;stroke-width:1;" x1="2171.6661" x2="2171.6661" y1="4030.668" y2="4052.668"/><polygon fill="#628A5B" points="2167.6661,4042.668,2175.6661,4042.668,2171.6661,4052.668" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1986.787" x2="1986.787" y1="4090.896" y2="4108.896"/><line style="stroke:#628A5B;stroke-width:1;" x1="1986.787" x2="2067.2265" y1="4108.896" y2="4108.896"/><polygon fill="#628A5B" points="2057.2265,4104.896,2067.2265,4108.896,2057.2265,4112.896" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2171.6661" x2="2171.6661" y1="4090.896" y2="4108.896"/><line style="stroke:#628A5B;stroke-width:1;" x1="2171.6661" x2="2091.2265" y1="4108.896" y2="4108.896"/><polygon fill="#628A5B" points="2101.2265,4104.896,2091.2265,4108.896,2101.2265,4112.896" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2079.2265" x2="2079.2265" y1="3998.668" y2="4018.668"/><polygon fill="#628A5B" points="2075.2265,4008.668,2083.2265,4008.668,2079.2265,4018.668" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2079.2265" x2="2079.2265" y1="4120.896" y2="4140.896"/><polygon fill="#628A5B" points="2075.2265,4130.896,2083.2265,4130.896,2079.2265,4140.896" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2194.4522" x2="2473.7631" y1="4211.124" y2="4211.124"/><polygon fill="#628A5B" points="2469.7631,4263.466,2477.7631,4263.466,2473.7631,4273.466" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2473.7631" x2="2473.7631" y1="4211.124" y2="4328.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="2473.7631" x2="2091.2265" y1="4328.694" y2="4328.694"/><polygon fill="#628A5B" points="2101.2265,4324.694,2091.2265,4328.694,2101.2265,4332.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2079.2265" x2="2079.2265" y1="4179.124" y2="4199.124"/><polygon fill="#628A5B" points="2075.2265,4189.124,2083.2265,4189.124,2079.2265,4199.124" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3065.6807" x2="3065.6807" y1="1094.498" y2="1114.498"/><polygon fill="#628A5B" points="3061.6807,1104.498,3069.6807,1104.498,3065.6807,1114.498" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3065.6807" x2="3065.6807" y1="1580.71" y2="1600.71"/><polygon fill="#628A5B" points="3061.6807,1590.71,3069.6807,1590.71,3065.6807,1600.71" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3065.6807" x2="3065.6807" y1="1638.938" y2="1671.28"/><polygon fill="#628A5B" points="3061.6807,1661.28,3069.6807,1661.28,3065.6807,1671.28" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5014.8362" x2="5014.8362" y1="2164.378" y2="2184.378"/><polygon fill="#628A5B" points="5010.8362,2174.378,5018.8362,2174.378,5014.8362,2184.378" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5102.1878" x2="5102.1878" y1="2314.834" y2="2334.834"/><polygon fill="#628A5B" points="5098.1878,2324.834,5106.1878,2324.834,5102.1878,2334.834" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4956.3596" x2="4927.4846" y1="2254.606" y2="2254.606"/><line style="stroke:#628A5B;stroke-width:1;" x1="4927.4846" x2="4927.4846" y1="2254.606" y2="2464.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="4927.4846" x2="5002.8362" y1="2464.062" y2="2464.062"/><polygon fill="#628A5B" points="4992.8362,2460.062,5002.8362,2464.062,4992.8362,2468.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5073.3127" x2="5102.1878" y1="2254.606" y2="2254.606"/><line style="stroke:#628A5B;stroke-width:1;" x1="5102.1878" x2="5102.1878" y1="2254.606" y2="2276.606"/><polygon fill="#628A5B" points="5098.1878,2266.606,5106.1878,2266.606,5102.1878,2276.606" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5102.1878" x2="5102.1878" y1="2373.062" y2="2378.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="5102.1878" x2="5014.8362" y1="2378.062" y2="2378.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="5014.8362" x2="5014.8362" y1="2378.062" y2="2393.062"/><polygon fill="#628A5B" points="5010.8362,2383.062,5018.8362,2383.062,5014.8362,2393.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5014.8362" x2="5014.8362" y1="2222.606" y2="2242.606"/><polygon fill="#628A5B" points="5010.8362,2232.606,5018.8362,2232.606,5014.8362,2242.606" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5014.8362" x2="5014.8362" y1="2106.15" y2="2126.15"/><polygon fill="#628A5B" points="5010.8362,2116.15,5018.8362,2116.15,5014.8362,2126.15" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5069.685" x2="5266.2999" y1="2405.062" y2="2405.062"/><polygon fill="#628A5B" points="5262.2999,2255.106,5266.2999,2245.106,5270.2999,2255.106" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5266.2999" x2="5266.2999" y1="2094.15" y2="2405.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="5266.2999" x2="5026.8362" y1="2094.15" y2="2094.15"/><polygon fill="#628A5B" points="5036.8362,2090.15,5026.8362,2094.15,5036.8362,2098.15" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5014.8362" x2="5014.8362" y1="2417.062" y2="2452.062"/><polygon fill="#628A5B" points="5010.8362,2442.062,5018.8362,2442.062,5014.8362,2452.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5014.8362" x2="5014.8362" y1="2062.15" y2="2082.15"/><polygon fill="#628A5B" points="5010.8362,2072.15,5018.8362,2072.15,5014.8362,2082.15" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4763.7287" x2="4643.4833" y1="2001.922" y2="2001.922"/><line style="stroke:#628A5B;stroke-width:1;" x1="4643.4833" x2="4643.4833" y1="2001.922" y2="2023.922"/><polygon fill="#628A5B" points="4639.4833,2013.922,4647.4833,2013.922,4643.4833,2023.922" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4894.5908" x2="5014.8362" y1="2001.922" y2="2001.922"/><line style="stroke:#628A5B;stroke-width:1;" x1="5014.8362" x2="5014.8362" y1="2001.922" y2="2023.922"/><polygon fill="#628A5B" points="5010.8362,2013.922,5018.8362,2013.922,5014.8362,2023.922" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4643.4833" x2="4643.4833" y1="2062.15" y2="2494.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="4643.4833" x2="4817.1597" y1="2494.062" y2="2494.062"/><polygon fill="#628A5B" points="4807.1597,2490.062,4817.1597,2494.062,4807.1597,2498.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5014.8362" x2="5014.8362" y1="2476.062" y2="2494.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="5014.8362" x2="4841.1597" y1="2494.062" y2="2494.062"/><polygon fill="#628A5B" points="4851.1597,2490.062,4841.1597,2494.062,4851.1597,2498.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.3947" x2="4741.3947" y1="3362.502" y2="3382.502"/><polygon fill="#628A5B" points="4737.3947,3372.502,4745.3947,3372.502,4741.3947,3382.502" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.3947" x2="4741.3947" y1="3522.958" y2="3542.958"/><polygon fill="#628A5B" points="4737.3947,3532.958,4745.3947,3532.958,4741.3947,3542.958" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4828.7463" x2="4828.7463" y1="3709.87" y2="3729.87"/><polygon fill="#628A5B" points="4824.7463,3719.87,4832.7463,3719.87,4828.7463,3729.87" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4682.9182" x2="4654.0431" y1="3649.642" y2="3649.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="4654.0431" x2="4654.0431" y1="3649.642" y2="3854.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="4654.0431" x2="4729.3947" y1="3854.44" y2="3854.44"/><polygon fill="#628A5B" points="4719.3947,3850.44,4729.3947,3854.44,4719.3947,3858.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4799.8713" x2="4828.7463" y1="3649.642" y2="3649.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="4828.7463" x2="4828.7463" y1="3649.642" y2="3671.642"/><polygon fill="#628A5B" points="4824.7463,3661.642,4832.7463,3661.642,4828.7463,3671.642" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4828.7463" x2="4828.7463" y1="3768.098" y2="3773.098"/><line style="stroke:#628A5B;stroke-width:1;" x1="4828.7463" x2="4741.3947" y1="3773.098" y2="3773.098"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.3947" x2="4741.3947" y1="3773.098" y2="3798.44"/><polygon fill="#628A5B" points="4737.3947,3788.44,4745.3947,3788.44,4741.3947,3798.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.3947" x2="4741.3947" y1="3581.186" y2="3637.642"/><polygon fill="#628A5B" points="4737.3947,3627.642,4745.3947,3627.642,4741.3947,3637.642" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.3947" x2="4741.3947" y1="3464.73" y2="3484.73"/><polygon fill="#628A5B" points="4737.3947,3474.73,4745.3947,3474.73,4741.3947,3484.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4796.2435" x2="5071.344" y1="3810.44" y2="3810.44"/><polygon fill="#628A5B" points="5067.344,3626.914,5071.344,3616.914,5075.344,3626.914" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5071.344" x2="5071.344" y1="3452.73" y2="3810.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="5071.344" x2="4753.3947" y1="3452.73" y2="3452.73"/><polygon fill="#628A5B" points="4763.3947,3448.73,4753.3947,3452.73,4763.3947,3456.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.3947" x2="4741.3947" y1="3822.44" y2="3842.44"/><polygon fill="#628A5B" points="4737.3947,3832.44,4745.3947,3832.44,4741.3947,3842.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.3947" x2="4741.3947" y1="3420.73" y2="3440.73"/><polygon fill="#628A5B" points="4737.3947,3430.73,4745.3947,3430.73,4741.3947,3440.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4484.3302" x2="4358.1278" y1="3302.274" y2="3302.274"/><line style="stroke:#628A5B;stroke-width:1;" x1="4358.1278" x2="4358.1278" y1="3302.274" y2="3324.274"/><polygon fill="#628A5B" points="4354.1278,3314.274,4362.1278,3314.274,4358.1278,3324.274" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4615.1923" x2="4741.3947" y1="3302.274" y2="3302.274"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.3947" x2="4741.3947" y1="3302.274" y2="3324.274"/><polygon fill="#628A5B" points="4737.3947,3314.274,4745.3947,3314.274,4741.3947,3324.274" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4358.1278" x2="4358.1278" y1="3362.502" y2="3884.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="4358.1278" x2="4537.7613" y1="3884.44" y2="3884.44"/><polygon fill="#628A5B" points="4527.7613,3880.44,4537.7613,3884.44,4527.7613,3888.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.3947" x2="4741.3947" y1="3866.44" y2="3884.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="4741.3947" x2="4561.7613" y1="3884.44" y2="3884.44"/><polygon fill="#628A5B" points="4571.7613,3880.44,4561.7613,3884.44,4571.7613,3888.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4549.7613" x2="4549.7613" y1="3254.886" y2="3290.274"/><polygon fill="#628A5B" points="4545.7613,3280.274,4553.7613,3280.274,4549.7613,3290.274" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4462.1139" x2="4242.2387" y1="3242.886" y2="3242.886"/><polygon fill="#628A5B" points="4238.2387,3789.8765,4246.2387,3789.8765,4242.2387,3799.8765" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4242.2387" x2="4242.2387" y1="3242.886" y2="4401.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="4242.2387" x2="2365.087" y1="4401.694" y2="4401.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.087" x2="2365.087" y1="4401.694" y2="4416.694"/><polygon fill="#628A5B" points="2361.087,4406.694,2369.087,4406.694,2365.087,4416.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="746.332" y2="755.446"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="1176.2169" y1="755.446" y2="755.446"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="755.446" y2="770.446"/><polygon fill="#628A5B" points="1172.2169,760.446,1180.2169,760.446,1176.2169,770.446" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="808.674" y2="813.674"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="2365.087" y1="813.674" y2="813.674"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.087" x2="2365.087" y1="813.674" y2="828.674"/><polygon fill="#628A5B" points="2361.087,818.674,2369.087,818.674,2365.087,828.674" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.087" x2="2365.087" y1="946.586" y2="979.814"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.087" x2="1176.2169" y1="979.814" y2="979.814"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="979.814" y2="998.042"/><polygon fill="#628A5B" points="1172.2169,988.042,1180.2169,988.042,1176.2169,998.042" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1036.27" y2="1041.27"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="3065.6807" y1="1041.27" y2="1041.27"/><line style="stroke:#628A5B;stroke-width:1;" x1="3065.6807" x2="3065.6807" y1="1041.27" y2="1056.27"/><polygon fill="#628A5B" points="3061.6807,1046.27,3069.6807,1046.27,3065.6807,1056.27" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3709.1264" x2="3709.1264" y1="1282.684" y2="1311.355"/><line style="stroke:#628A5B;stroke-width:1;" x1="3709.1264" x2="1176.2169" y1="1311.355" y2="1311.355"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1311.355" y2="1340.026"/><polygon fill="#628A5B" points="1172.2169,1330.026,1180.2169,1330.026,1176.2169,1340.026" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1196.726" y2="1217.114"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="3709.1264" y1="1217.114" y2="1217.114"/><line style="stroke:#628A5B;stroke-width:1;" x1="3709.1264" x2="3709.1264" y1="1217.114" y2="1244.456"/><polygon fill="#628A5B" points="3705.1264,1234.456,3713.1264,1234.456,3709.1264,1244.456" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3065.6807" x2="3065.6807" y1="1152.726" y2="1157.726"/><line style="stroke:#628A5B;stroke-width:1;" x1="3065.6807" x2="1176.2169" y1="1157.726" y2="1157.726"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1157.726" y2="1172.726"/><polygon fill="#628A5B" points="1172.2169,1162.726,1180.2169,1162.726,1176.2169,1172.726" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1522.482" y2="1527.482"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="3065.6807" y1="1527.482" y2="1527.482"/><line style="stroke:#628A5B;stroke-width:1;" x1="3065.6807" x2="3065.6807" y1="1527.482" y2="1542.482"/><polygon fill="#628A5B" points="3061.6807,1532.482,3069.6807,1532.482,3065.6807,1542.482" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1455.6154" x2="1455.6154" y1="1969.922" y2="1974.922"/><line style="stroke:#628A5B;stroke-width:1;" x1="1455.6154" x2="4829.1597" y1="1974.922" y2="1974.922"/><line style="stroke:#628A5B;stroke-width:1;" x1="4829.1597" x2="4829.1597" y1="1974.922" y2="1989.922"/><polygon fill="#628A5B" points="4825.1597,1979.922,4833.1597,1979.922,4829.1597,1989.922" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.933" x2="1176.933" y1="2666.518" y2="2675.632"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.933" x2="2365.803" y1="2675.632" y2="2675.632"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.803" x2="2365.803" y1="2675.632" y2="2690.632"/><polygon fill="#628A5B" points="2361.803,2680.632,2369.803,2680.632,2365.803,2690.632" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.803" x2="2365.803" y1="2953.316" y2="2966.873"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.803" x2="1176.933" y1="2966.873" y2="2966.873"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.933" x2="1176.933" y1="2966.873" y2="2980.43"/><polygon fill="#628A5B" points="1172.933,2970.43,1180.933,2970.43,1176.933,2980.43" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.933" x2="1176.933" y1="3018.658" y2="3025.101"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.933" x2="2365.803" y1="3025.101" y2="3025.101"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.803" x2="2365.803" y1="3025.101" y2="3038.658"/><polygon fill="#628A5B" points="2361.803,3028.658,2369.803,3028.658,2365.803,3038.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.803" x2="2365.803" y1="3062.658" y2="3066.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.803" x2="1425.6154" y1="3066.658" y2="3066.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1425.6154" x2="1425.6154" y1="3066.658" y2="3084.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1425.6154" x2="1443.6154" y1="3084.658" y2="3084.658"/><polygon fill="#628A5B" points="1433.6154,3080.658,1443.6154,3084.658,1433.6154,3088.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4829.1597" x2="4829.1597" y1="2506.062" y2="2511.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="4829.1597" x2="1455.6154" y1="2511.062" y2="2511.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="1455.6154" x2="1455.6154" y1="2511.062" y2="2526.062"/><polygon fill="#628A5B" points="1451.6154,2516.062,1459.6154,2516.062,1455.6154,2526.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3065.6807" x2="3065.6807" y1="1709.508" y2="1736.85"/><line style="stroke:#628A5B;stroke-width:1;" x1="3065.6807" x2="1176.2169" y1="1736.85" y2="1736.85"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="1736.85" y2="1751.85"/><polygon fill="#628A5B" points="1172.2169,1741.85,1180.2169,1741.85,1176.2169,1751.85" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2079.2265" x2="2079.2265" y1="4223.124" y2="4238.738"/><line style="stroke:#628A5B;stroke-width:1;" x1="2079.2265" x2="890.3565" y1="4238.738" y2="4238.738"/><line style="stroke:#628A5B;stroke-width:1;" x1="890.3565" x2="890.3565" y1="4238.738" y2="4254.352"/><polygon fill="#628A5B" points="886.3565,4244.352,894.3565,4244.352,890.3565,4254.352" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="890.3565" x2="890.3565" y1="4292.58" y2="4301.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="890.3565" x2="2079.2265" y1="4301.694" y2="4301.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="2079.2265" x2="2079.2265" y1="4301.694" y2="4316.694"/><polygon fill="#628A5B" points="2075.2265,4306.694,2083.2265,4306.694,2079.2265,4316.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1087.9325" x2="1075.9325" y1="3928.44" y2="3928.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="1075.9325" x2="1075.9325" y1="3928.44" y2="3946.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="1075.9325" x2="2079.2265" y1="3946.44" y2="3946.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="2079.2265" x2="2079.2265" y1="3946.44" y2="3960.44"/><polygon fill="#628A5B" points="2075.2265,3950.44,2083.2265,3950.44,2079.2265,3960.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2079.2265" x2="2079.2265" y1="4340.694" y2="4344.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="2079.2265" x2="1146.2169" y1="4344.694" y2="4344.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="1146.2169" x2="1146.2169" y1="4344.694" y2="4362.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="1146.2169" x2="1164.2169" y1="4362.694" y2="4362.694"/><polygon fill="#628A5B" points="1154.2169,4358.694,1164.2169,4362.694,1154.2169,4366.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4549.7613" x2="4549.7613" y1="3896.44" y2="3901.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="4549.7613" x2="1176.2169" y1="3901.44" y2="3901.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="3901.44" y2="3916.44"/><polygon fill="#628A5B" points="1172.2169,3906.44,1180.2169,3906.44,1176.2169,3916.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="4374.694" y2="4384.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="5386.9548" y1="4384.694" y2="4384.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="5386.9548" x2="5386.9548" y1="3242.886" y2="4384.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="5386.9548" x2="4637.4086" y1="3242.886" y2="3242.886"/><polygon fill="#628A5B" points="4647.4086,3238.886,4637.4086,3242.886,4647.4086,3246.886" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="1176.2169" y1="3210.886" y2="3215.886"/><line style="stroke:#628A5B;stroke-width:1;" x1="1176.2169" x2="4549.7613" y1="3215.886" y2="3215.886"/><line style="stroke:#628A5B;stroke-width:1;" x1="4549.7613" x2="4549.7613" y1="3215.886" y2="3230.886"/><polygon fill="#628A5B" points="4545.7613,3220.886,4553.7613,3220.886,4549.7613,3230.886" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.087" x2="2365.087" y1="4454.922" y2="4464.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="2365.087" x2="254.8274" y1="4464.036" y2="4464.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="254.8274" x2="254.8274" y1="4464.036" y2="4479.036"/><polygon fill="#628A5B" points="250.8274,4469.036,258.8274,4469.036,254.8274,4479.036" style="stroke:#628A5B;stroke-width:1;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="50.26" x="367.4078" y="78.528">main.cc</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="201.9644" x="1237.7968" y="78.528">BiergartenPipelineOrchestrator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="127.3512" x="2324.1254" y="78.528">SqliteExportService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="75.5861" x="3199.6705" y="78.528">JsonLoader</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="125.6712" x="3854.6874" y="78.528">IEnrichmentService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="96.6737" x="4863.201" y="78.528">DataGenerator</text><?plantuml-src hLZhRXkt4lwlfo0Ke5YXbcexb-R8GGvqSuvpd4ij9y412WZKBYMntYMt9DUsMXNeG_G9-oJd6-v5guiTEwX-s18v70vdllbcI7ibLSeDJvXrorZWhv6XovAuOQkPICnu5hjJhTnxdWZM7BvZOwviSx_CMFucsD6psgIJBXRhvPzrVBNGryrz4dxnyM5jQih3gxdHcOe6EjQ6FJdjdGvE_xL_xqBa-ENJPyUzVVhl4kWPes-AoHV7BtlF-xN9zzg9_hOPezxfuUZbjfGsaJ25nFDdFpvxSLJV97JoMhfb_wj7gYGVf6yeUQ9Lz72rvOAwzfrJhwszKsHy8vEOgwySUrFgSY73AoMiPOUTfus6ZmoxN0ZMbyBCkN52iI5td7sKgOYb4YmOPCO8vTZVV_x5naiLBenMEhE567UBLgEnUd9wVFhYz72LSAawORXgM0TbZUx02EwWdVmYei62AoNYL-TwFbBEB5-pMCydOJvwqkYEKtwZQ8n5qgRSXGjXc5j0H_Ip2h1gM0rtknUP2bgjauP2v9cHyuLhC7yKhU8b2xKAlU7Xaaa59OA5nK7IucXTo7FWDv8XR8oAZLXaS0PRjunn5K5sfiqDDv5bK6AaiCnfPjE8pCMKtm8pqi2QJ7MmuAt6Bb2O6Qdcp2uo5scSZyySZbNN7yRQ2jjf21KnEawZ-v4RAtfcdYLGQGDkvk41mzzh75ZEMD33BhoSPjSybj6_MsI2Oe7IBMpUXRkOG68PzWFBB9yB-66cJp1bdKuR8hO8xbBO5cqhPur6zqn9npwaGet7vsmUwocF8Kln-uwTnppXX748ZsaCuOfajvlmAp6HwXSHEcs2JgUp7P6-L73P6QoP2tF0paOA7BSWkyV2NCjG77WalH5A60uT1rXpDhfDjLaBd7qqEad1CIRXpf6QBs8wY2L5SygjeEXenThjHCF0Y5tR3ajq9E8syHS6w4VTlQN1dT3ZyvLrKRURAVbh9YQfCw_MsL3cmGS3r86VoSJNhmESidk_K07GBM_uCIQT5V6CISjiBQ4emInFKcYQ7m1AfP_88_FSFLAh0q8Z4zv1ZCSnM_0K8QFpkmKqvYYk7HR9cRFbwdw3Lpa09B24AZ3-wLp2xdoV4w_aSDGR7Qx6lyQOs0WGLhuHxfCBBsK2RJW2pZX3oC0Nrea4yHKqXIXUIv3GINsd7HVrCna3CHmQX5smQMNqn0eHJLvzkXom21eTDBxkM6yEcybOADGthE-HExm2XVI04vdDPZDvov0tbAEkD1BU8rSjSKXfdSLImZw8hSy66daPahinEheLOUQGxsCuA-5iE3mdCyMSQEBIe1RpNFHRNFvJ9ino06S8-qMwnG14wSc5t49gZaVzuM3rrcfrhZbyXoNh7zqk_J_NeKU63Pfn-RNp2uIQX58FRHWv5xRRzV0I0M0pgKGFa3VbZtP8-sz7P7k-hFcU0OyElmbhDmj4Z0L8QIPukCY1Zqmj3mCs0vY32q4LXUWpz3uYPbiz6Gv6BuSlLxjSiYBY0nPBBOYZ4xSkWFqjOhwDOp7sHLx1k4Zo7KLi9gZC48fywidGBsXEZRY1DKrW1YS9dKz6Zd41IaUT-Tqxo2p_g2JyEd0oHEaConyCW0DFsbI4SWPqfg3cLeUz0tNjc94lBdcjnOnmcG7gk682XBZq7IES0oGwd_MCLR4WHpqm68no0_LLNsKfct54PbrDbhdJYuA20gWyFQ71IFrvoArvBSdh3WJ7K2fOVXWKVGZzNWRaWEN7duHvPFuuoKr6_S7V0XH3hKJhCKbK50_noGfZ0r5iF2aWSsSYqPUFMA4LH-wanRTrwj0y0Eg9nVQNUMukW-Qi76jFb-qYu9khneZIrY9R3ErRim7B4QL3ICoE10WvdQHe6L0sG7J6eeMXze2YJQX1WqRz2rNH4htx84CTZBo5CgdQYKYqMHADedgw4ZuUp1HOua947q6bQYBOs_67zvvYRT7XnCj_9Edh4BaduRjZJmvqVmagtq-coqdXnuEV5PgQmh_rSLRoLaTQ_VJenOl9aQS1GZjfWrUkWNO-XLNKmXNhjZgf1q1_dIIvgOoGM42B1MWie3rXOE589uH74eNNde-6ewFLHlkpydDaO3M484UYD8a2NitaUsBNeG0-4lZDEXd-XwDiViVoRkd4Y-HM-XvkTt7gcwj9XBXIJxISj5yJXeFcf_7eOl9cz7vqqRiy-_2-sJefbcpHA7qkXDNnTTuKRwth98GvYygFIf9lriPcdM9jZR3eOqIAbgpIYqvX9anWVICnoLSVe9yLflgHyDk9qsXCKSgkoF6Kv6zmzqcugKo6fi_K9HSiGIA1uJUvgfeKUVxCveZ_lD5MLp7EFwW4_AhwlSc0nOOzzAgmyFllJpP6VN-Iz-mUd4MN3iSXLv6L-RdMQt9wh7k75ObKRC1UiQT5-bH65Zrz0RI7be4Dv95fDWj3t1PdMRpF3rtVgusGiN50oUUz6KqeXVC68vw0gPoj_5inDRM47sPzQTmYC6f-7xAyDazD5Bo9dascj0pN7r6snVu2a7_WlBaFFH8170eEKE8Qt7b-_gxDCxS0VKGxo2j-tz_Z5YT04qiUkH0XBjG1OId_MXqXBwKvxr1Bu2byFugw5m8EgrXg8gDIoIwUa0ZOorKD4Z9yG9hPsV2aiGkKKfmC1EF-jrlVfQIWtDZHRIXIhpBa6JnVNbYbrx3VyaTXQfj2MNFZTb5q7Csxphu-rlRCfj8QR7EDELMdcCIzj51VAll7Ueu-EaBXE_RzVSTUZl_6GlYeil2Led1tIG341T9MNFXEhMYXS-_TNIlw5wCleul_xIaNEobTBnMxo-wj5XkrOgDIFBPEv65RxYiLLQ6eoUIrOfeFRAJw0uf5lLJiIUmzPUAnHMAT8Wyk43jXMRk71FDMaOT6M-ktf0Ull__ygpov8o6wrHWkmVd--S5agcYtjeDLLQD7NaaUM8c-JjnRj5qcRzJVYEY3gVikujuXgA-HzZfmfMXXqPsS_MsC_KY-VWHRxwdO_cKu9k008wb1_LNqleeBLjju_tSgKNglBTzZwStMIPK1Q40IRRstHTpqSSNdcrVGnnQ6KirTXBslKDpt7dOgrVxNhO5E4hh7rT-DCEeVWBtZw3sp_lvKlsPjFx9t_RgjHtHwTTx_Xex92tyRP8Sd3Vy8_7y0?></g></svg> |