mirror of
https://github.com/aaronpo97/the-biergarten-app.git
synced 2026-07-16 09:37:23 +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:5577px;height:4696px;background:#FAFCF9;" version="1.1" viewBox="0 0 5577 4696" width="5577px" zoomAndPan="magnify"><?plantuml 1.2026.3?><defs/><g><rect fill="#FAFCF9" height="4696" style="stroke:none;stroke-width:1;" width="5577" 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="2466.2947" 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="5530.4495" 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="1136.3553" 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="975.2459" y="1374.026"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="138.7404" x="985.2459" 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="287.6629" x="1153.9863" y="1374.026"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="267.6629" x="1163.9863" y="1397.914">Store EnrichedCity{City, 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="1099.4583,1172.726,1252.9755,1172.726,1264.9755,1184.726,1252.9755,1196.726,1099.4583,1196.726,1087.4583,1184.726,1099.4583,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="153.5172" x="1099.4583" y="1189.5">For each sampled City?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="1053.5364" 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="828.4994" y="1931.694"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="138.7404" x="838.4994" 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="1308.6883" y="1931.694"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="251.7518" x="1318.6883" y="1955.582">Sample UserPersona (uniform random)</text><polygon fill="#FAFCF9" points="1368.2798,2526.062,1520.8487,2526.062,1532.8487,2538.062,1520.8487,2550.062,1368.2798,2550.062,1356.2798,2538.062,1368.2798,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="1368.2798" y="2542.836">Generation successful?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1333.5053" y="2533.722">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="1532.8487" 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="1017.2398" y="2570.062"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="277.284" x="1027.2398" y="2593.95">BuildEmail(name, used_email_local_parts)</text><path d="M1280.3964,2624.176 L1280.3964,2643.404 L1260.3964,2647.404 L1280.3964,2651.404 L1280.3964,2670.632 A0,0 0 0 0 1280.3964,2670.632 L1558.0623,2670.632 A0,0 0 0 0 1558.0623,2670.632 L1558.0623,2634.176 L1548.0623,2624.176 L1280.3964,2624.176 A0,0 0 0 0 1280.3964,2624.176" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M1548.0623,2624.176 L1548.0623,2634.176 L1558.0623,2634.176 L1548.0623,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="1286.3964" 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="1286.3964" 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="1071.3672" y="2628.29"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="169.0293" x="1081.3672" 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="1046.601" y="2980.43"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="218.5615" x="1056.601" 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="1578.0623" y="2570.062"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="270.3687" x="1588.0623" y="2593.95">Log warning "Generation failed, skipping..."</text><polygon fill="#FAFCF9" points="1444.5642,3072.658,1456.5642,3084.658,1444.5642,3096.658,1432.5642,3084.658,1444.5642,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="922.4907" x="1901.431" 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="2149.0104" y="828.674"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="333.7568" x="2159.0104" y="852.562">GetUtcTimestamp() from SystemDateTimeProvider</text><path d="M2387.0808,876.902 L2387.0808,923.472 L2367.0808,927.472 L2387.0808,931.472 L2387.0808,978.042 A0,0 0 0 0 2387.0808,978.042 L2818.9217,978.042 A0,0 0 0 0 2818.9217,978.042 L2818.9217,886.902 L2808.9217,876.902 L2387.0808,876.902 A0,0 0 0 0 2387.0808,876.902" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M2808.9217,876.902 L2808.9217,886.902 L2818.9217,886.902 L2808.9217,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="2393.0808" 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="2393.0808" 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="2393.0808" y="932.246">Opens DB Connection</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="145.6175" x="2393.0808" y="950.474">Executes Schema DDL</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="122.8503" x="2393.0808" 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="2284.6967" y="908.358"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="62.3841" x="2294.6967" 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="2213.3145" y="2690.632"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="184.4783" x="2223.3145" y="2714.52">ProcessRecord(UserRecord)</text><polygon fill="#FAFCF9" points="2269.3273,2748.86,2361.78,2748.86,2373.78,2760.86,2361.78,2772.86,2269.3273,2772.86,2257.3273,2760.86,2269.3273,2748.86" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="92.4526" x="2269.3273" y="2765.634">City in cache?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="2234.5528" y="2756.52">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="2373.78" 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="109.0155" x="2182.9564" y="2782.86"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="89.0155" x="2192.9564" y="2806.748">Reuse city_id</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="163.3426" x="2311.9719" y="2782.86"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="143.3426" x="2321.9719" y="2806.748">Insert City & Cache ID</text><polygon fill="#FAFCF9" points="2315.5536,2827.088,2327.5536,2839.088,2315.5536,2851.088,2303.5536,2839.088,2315.5536,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="172.3867" x="2229.3603" y="2871.088"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="152.3867" x="2239.3603" y="2894.976">Insert User (FK: city_id)</text><polygon fill="#FAFCF9" points="2212.3279,2929.316,2418.7793,2929.316,2430.7793,2941.316,2418.7793,2953.316,2212.3279,2953.316,2200.3279,2941.316,2212.3279,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="2319.5536" y="2967.204">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="206.4514" x="2212.3279" y="2946.09">Exception caught during insert?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="2430.7793" y="2936.976">no</text><polygon fill="#FAFCF9" points="2315.5536,3038.658,2327.5536,3050.658,2315.5536,3062.658,2303.5536,3050.658,2315.5536,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="1914.3601" y="3960.44"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="231.3364" x="1924.3601" y="3984.328">ProcessRecord(GeneratedBrewery)</text><polygon fill="#FAFCF9" points="1993.802,4018.668,2086.2546,4018.668,2098.2546,4030.668,2086.2546,4042.668,1993.802,4042.668,1981.802,4030.668,1993.802,4018.668" style="stroke:#628A5B;stroke-width:0.5;"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="92.4526" x="1993.802" y="4035.442">City in cache?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="1959.0275" y="4026.328">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="2098.2546" 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="109.0155" x="1907.431" y="4052.668"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="89.0155" x="1917.431" y="4076.556">Reuse city_id</text><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="163.3426" x="2036.4465" y="4052.668"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="143.3426" x="2046.4465" y="4076.556">Insert City & Cache ID</text><polygon fill="#FAFCF9" points="2040.0283,4096.896,2052.0283,4108.896,2040.0283,4120.896,2028.0283,4108.896,2040.0283,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="196.2148" x="1941.9209" y="4140.896"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="176.2148" x="1951.9209" y="4164.784">Insert Brewery (FK: city_id)</text><polygon fill="#FAFCF9" points="1936.8026,4199.124,2143.254,4199.124,2155.254,4211.124,2143.254,4223.124,1936.8026,4223.124,1924.8026,4211.124,1936.8026,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="2044.0283" y="4237.012">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="206.4514" x="1936.8026" y="4215.898">Exception caught during insert?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="2155.254" y="4206.784">no</text><polygon fill="#FAFCF9" points="2040.0283,4316.694,2052.0283,4328.694,2040.0283,4340.694,2028.0283,4328.694,2040.0283,4316.694" style="stroke:#628A5B;stroke-width:0.5;"/><path d="M2384.7743,4412.58 L2384.7743,4431.808 L2364.7743,4435.808 L2384.7743,4439.808 L2384.7743,4459.036 A0,0 0 0 0 2384.7743,4459.036 L2593.9799,4459.036 A0,0 0 0 0 2593.9799,4459.036 L2593.9799,4422.58 L2583.9799,4412.58 L2384.7743,4412.58 A0,0 0 0 0 2384.7743,4412.58" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M2583.9799,4412.58 L2583.9799,4422.58 L2593.9799,4422.58 L2583.9799,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="2390.7743" y="4431.468">Commits Transaction</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="188.2056" x="2390.7743" 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="2287.0032" y="4416.694"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="57.7711" x="2297.0032" y="4440.582">Finalize()</text><line style="stroke:#547461;stroke-width:0.3;" x1="1901.431" x2="1901.431" y1="64.64" y2="4675.72"/><rect fill="#E2EBDC" height="4611.08" style="stroke:#E2EBDC;stroke-width:1;" width="748.6874" x="2823.9217" y="64.64"/><rect fill="#FAFCF9" height="38.228" rx="12.5" ry="12.5" style="stroke:#547461;stroke-width:0.5;" width="253.8109" x="2899.577" y="1056.27"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="233.8109" x="2909.577" y="1080.158">JsonLoader::LoadCities("cities.json")</text><path d="M3224.005,1119.498 L3224.005,1129.612 L3204.005,1133.612 L3224.005,1137.612 L3224.005,1147.726 A0,0 0 0 0 3224.005,1147.726 L3452.2544,1147.726 A0,0 0 0 0 3452.2544,1147.726 L3452.2544,1129.498 L3442.2544,1119.498 L3224.005,1119.498 A0,0 0 0 0 3224.005,1119.498" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3442.2544,1119.498 L3442.2544,1129.498 L3452.2544,1129.498 L3442.2544,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="3230.005" 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="2848.9599" y="1114.498"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="335.045" x="2858.9599" 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="2916.7988" y="1542.482"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="199.3674" x="2926.7988" 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="2829.9217" y="1600.71"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="373.1216" x="2839.9217" y="1624.598">LoadForenamesByCountry("forenames-by-country.json")</text><path d="M3236.2567,1648.938 L3236.2567,1686.394 L3216.2567,1690.394 L3236.2567,1694.394 L3236.2567,1731.85 A0,0 0 0 0 3236.2567,1731.85 L3567.6091,1731.85 A0,0 0 0 0 3567.6091,1731.85 L3567.6091,1658.938 L3557.6091,1648.938 L3236.2567,1648.938 A0,0 0 0 0 3236.2567,1648.938" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M3557.6091,1648.938 L3557.6091,1658.938 L3567.6091,1658.938 L3557.6091,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="3242.2567" 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="3242.2567" y="1686.054">MockCuratedDataService (--mocked) returns a</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="279.4402" x="3242.2567" 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="3242.2567" 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="2836.7082" y="1671.28"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="359.5485" x="2846.7082" y="1695.168">LoadSurnamesByCountry("surnames-by-country.json")</text><line style="stroke:#547461;stroke-width:0.3;" x1="2823.9217" x2="2823.9217" y1="64.64" y2="4675.72"/><rect fill="#DCE8D8" height="4611.08" style="stroke:#DCE8D8;stroke-width:1;" width="611.4314" x="3572.6091" y="64.64"/><path d="M3781.2473,1222.114 L3781.2473,1259.57 L3761.2473,1263.57 L3781.2473,1267.57 L3781.2473,1305.026 A0,0 0 0 0 3781.2473,1305.026 L4179.0405,1305.026 A0,0 0 0 0 4179.0405,1305.026 L4179.0405,1232.114 L4169.0405,1222.114 L3781.2473,1222.114 A0,0 0 0 0 3781.2473,1222.114" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M4169.0405,1222.114 L4169.0405,1232.114 L4179.0405,1232.114 L4169.0405,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="3787.2473" y="1241.002">WikipediaEnrichmentService fetches a generic</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="323.5059" x="3787.2473" 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="3787.2473" 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="3787.2473" 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="3578.6091" y="1244.456"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="162.6382" x="3588.6091" y="1268.344">GetLocationContext(loc)</text><line style="stroke:#547461;stroke-width:0.3;" x1="3572.6091" x2="3572.6091" y1="64.64" y2="4675.72"/><rect fill="#E5EDE1" height="4611.08" style="stroke:#E5EDE1;stroke-width:1;" width="1365.5471" x="4184.0405" y="64.64"/><polygon fill="#FAFCF9" points="4725.4793,1989.922,4832.3414,1989.922,4844.3414,2001.922,4832.3414,2013.922,4725.4793,2013.922,4713.4793,2001.922,4725.4793,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="4725.4793" y="2006.696">Generator Mode</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="101.4686" x="4612.0107" y="1997.582">MockGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="104.5242" x="4844.3414" 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="4491.3448" y="2023.922"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.7782" x="4501.3448" y="2047.81">DeterministicHash & Format</text><path d="M5155.3558,2028.922 L5155.3558,2039.036 L5135.3558,2043.036 L5155.3558,2047.036 L5155.3558,2057.15 A0,0 0 0 0 5155.3558,2057.15 L5544.5875,2057.15 A0,0 0 0 0 5544.5875,2057.15 L5544.5875,2038.922 L5534.5875,2028.922 L5155.3558,2028.922 A0,0 0 0 0 5155.3558,2028.922" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M5534.5875,2028.922 L5534.5875,2038.922 L5544.5875,2038.922 L5534.5875,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="5161.3558" 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="4793.8177" y="2023.922"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="321.5381" x="4803.8177" 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="4725.123" y="2126.15"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="458.9275" x="4735.123" 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="4863.8998" y="2184.378"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="181.3739" x="4873.8998" y="2208.266">ValidateUserJson(raw, user)</text><polygon fill="#FAFCF9" points="4918.1102,2242.606,5011.0633,2242.606,5023.0633,2254.606,5011.0633,2266.606,4918.1102,2266.606,4906.1102,2254.606,4918.1102,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="4918.1102" y="2259.38">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="4883.3357" y="2250.266">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="5023.0633" 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="5006.7616" y="2276.606"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="70.3536" x="5016.7616" 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="4912.2352" y="2334.834"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="259.4065" x="4922.2352" y="2358.722">Append validation error to retry prompt</text><polygon fill="#FAFCF9" points="4964.5868,2082.15,4976.5868,2094.15,4964.5868,2106.15,4952.5868,2094.15,4964.5868,2082.15" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4921.738,2393.062,5007.4356,2393.062,5019.4356,2405.062,5007.4356,2417.062,4921.738,2417.062,4909.738,2405.062,4921.738,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="4921.738" y="2409.836">Attempt < 3?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="5019.4356" y="2400.722">yes</text><polygon fill="#FAFCF9" points="4964.5868,2452.062,4976.5868,2464.062,4964.5868,2476.062,4952.5868,2464.062,4964.5868,2452.062" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4778.9104,2482.062,4790.9104,2494.062,4778.9104,2506.062,4766.9104,2494.062,4778.9104,2482.062" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4457.132,3290.274,4563.9941,3290.274,4575.9941,3302.274,4563.9941,3314.274,4457.132,3314.274,4445.132,3302.274,4457.132,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="4457.132" y="3307.048">Generator Mode</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="101.4686" x="4343.6633" y="3297.934">MockGenerator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="104.5242" x="4575.9941" 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="4217.0405" y="3324.274"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="183.7782" x="4227.0405" 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="4618.7979" y="3324.274"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="146.7972" x="4628.7979" y="3348.162">PrepareRegionContext</text><path d="M4907.4853,3387.502 L4907.4853,3397.616 L4887.4853,3401.616 L4907.4853,3405.616 L4907.4853,3415.73 A0,0 0 0 0 4907.4853,3415.73 L5325.7566,3415.73 A0,0 0 0 0 5325.7566,3415.73 L5325.7566,3397.502 L5315.7566,3387.502 L4907.4853,3387.502 A0,0 0 0 0 4907.4853,3387.502" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M5315.7566,3387.502 L5315.7566,3397.502 L5325.7566,3397.502 L5315.7566,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="4913.4853" 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="4516.9077" y="3382.502"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="350.5777" x="4526.9077" 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="4450.8187" y="3484.73"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="482.7556" x="4460.8187" 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="4576.9412" y="3542.958"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="230.5106" x="4586.9412" y="3566.846">ValidateBreweryJson(raw, brewery)</text><path d="M4760.673,3591.186 L4760.673,3637.642 L5020.1458,3637.642 L5020.1458,3601.186 L5010.1458,3591.186 L4760.673,3591.186" fill="#EAF0E8" style="stroke:#547461;stroke-width:0.5;"/><path d="M5010.1458,3591.186 L5010.1458,3601.186 L5020.1458,3601.186 L5010.1458,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="4766.673" 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="4766.673" y="3628.302">it is not raised on truncation.</text><polygon fill="#FAFCF9" points="4655.72,3637.642,4748.673,3637.642,4760.673,3649.642,4748.673,3661.642,4655.72,3661.642,4643.72,3649.642,4655.72,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="4655.72" y="3654.416">Is JSON Valid?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="4620.9454" y="3645.302">yes</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="16.3345" x="4760.673" 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="4744.3713" y="3671.642"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="70.3536" x="4754.3713" 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="4649.8449" y="3729.87"/><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="259.4065" x="4659.8449" y="3753.758">Append validation error to retry prompt</text><polygon fill="#FAFCF9" points="4702.1965,3440.73,4714.1965,3452.73,4702.1965,3464.73,4690.1965,3452.73,4702.1965,3440.73" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4659.3477,3798.44,4745.0453,3798.44,4757.0453,3810.44,4745.0453,3822.44,4659.3477,3822.44,4647.3477,3810.44,4659.3477,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="4659.3477" y="3815.214">Attempt < 3?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="22.7745" x="4757.0453" y="3806.1">yes</text><polygon fill="#FAFCF9" points="4702.1965,3842.44,4714.1965,3854.44,4702.1965,3866.44,4690.1965,3854.44,4702.1965,3842.44" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4510.563,3872.44,4522.563,3884.44,4510.563,3896.44,4498.563,3884.44,4510.563,3872.44" style="stroke:#628A5B;stroke-width:0.5;"/><polygon fill="#FAFCF9" points="4434.9157,3230.886,4586.2104,3230.886,4598.2104,3242.886,4586.2104,3254.886,4434.9157,3254.886,4422.9157,3242.886,4434.9157,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="4514.563" y="3268.774">Remaining cities</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="151.2948" x="4434.9157" y="3247.66">For each EnrichedCity?</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="33.922" x="4388.9937" y="3238.546">Done</text><line style="stroke:#547461;stroke-width:0.3;" x1="4184.0405" x2="4184.0405" y1="64.64" y2="4675.72"/><line style="stroke:#547461;stroke-width:0.3;" x1="5549.5875" x2="5549.5875" y1="64.64" y2="4675.72"/><polygon fill="#628A5B" points="5343.7566,3788.098,5347.7566,3778.098,5351.7566,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="1054.6161" y1="1352.026" y2="1352.026"/><line style="stroke:#628A5B;stroke-width:1;" x1="1054.6161" x2="1054.6161" y1="1352.026" y2="1374.026"/><polygon fill="#628A5B" points="1050.6161,1364.026,1058.6161,1364.026,1054.6161,1374.026" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1235.4565" x2="1297.8177" y1="1352.026" y2="1352.026"/><line style="stroke:#628A5B;stroke-width:1;" x1="1297.8177" x2="1297.8177" y1="1352.026" y2="1374.026"/><polygon fill="#628A5B" points="1293.8177,1364.026,1301.8177,1364.026,1297.8177,1374.026" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1054.6161" x2="1054.6161" y1="1412.254" y2="1430.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1054.6161" 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="1297.8177" x2="1297.8177" y1="1412.254" y2="1430.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="1297.8177" 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="1264.9755" y1="1184.726" y2="1184.726"/><polygon fill="#628A5B" points="1274.9755,1180.726,1264.9755,1184.726,1274.9755,1188.726" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1087.4583" x2="953.2459" y1="1184.726" y2="1184.726"/><polygon fill="#628A5B" points="949.2459,1307.07,957.2459,1307.07,953.2459,1317.07" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="953.2459" x2="953.2459" y1="1184.726" y2="1464.254"/><line style="stroke:#628A5B;stroke-width:1;" x1="953.2459" 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="1165.8818" x2="1165.8818" y1="2608.29" y2="2628.29"/><polygon fill="#628A5B" points="1161.8818,2618.29,1169.8818,2618.29,1165.8818,2628.29" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1356.2798" x2="1165.8818" y1="2538.062" y2="2538.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="1165.8818" x2="1165.8818" y1="2538.062" y2="2570.062"/><polygon fill="#628A5B" points="1161.8818,2560.062,1169.8818,2560.062,1165.8818,2570.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1532.8487" x2="1723.2467" y1="2538.062" y2="2538.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="1723.2467" x2="1723.2467" y1="2538.062" y2="2570.062"/><polygon fill="#628A5B" points="1719.2467,2560.062,1727.2467,2560.062,1723.2467,2570.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1723.2467" x2="1723.2467" y1="2608.29" y2="3084.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1723.2467" x2="1456.5642" y1="3084.658" y2="3084.658"/><polygon fill="#628A5B" points="1466.5642,3080.658,1456.5642,3084.658,1466.5642,3088.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1069.7867" x2="907.8696" y1="1899.694" y2="1899.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="907.8696" x2="907.8696" y1="1899.694" y2="1931.694"/><polygon fill="#628A5B" points="903.8696,1921.694,911.8696,1921.694,907.8696,1931.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1282.6471" x2="1444.5642" y1="1899.694" y2="1899.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="1444.5642" x2="1444.5642" y1="1899.694" y2="1931.694"/><polygon fill="#628A5B" points="1440.5642,1921.694,1448.5642,1921.694,1444.5642,1931.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="907.8696" x2="907.8696" y1="1969.922" y2="3118.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="907.8696" 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="1444.5642" x2="1444.5642" y1="3096.658" y2="3118.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1444.5642" 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="1882.431" y1="3140.658" y2="3140.658"/><polygon fill="#628A5B" points="1878.431,2434.448,1882.431,2424.448,1886.431,2434.448" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1882.431" x2="1882.431" y1="1763.85" y2="3140.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1882.431" 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="806.4994" y1="1763.85" y2="1763.85"/><polygon fill="#628A5B" points="802.4994,2420.448,810.4994,2420.448,806.4994,2430.448" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="806.4994" x2="806.4994" y1="1763.85" y2="3152.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="806.4994" 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="2325.8888" x2="2325.8888" y1="866.902" y2="908.358"/><polygon fill="#628A5B" points="2321.8888,898.358,2329.8888,898.358,2325.8888,908.358" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2257.3273" x2="2237.4641" y1="2760.86" y2="2760.86"/><line style="stroke:#628A5B;stroke-width:1;" x1="2237.4641" x2="2237.4641" y1="2760.86" y2="2782.86"/><polygon fill="#628A5B" points="2233.4641,2772.86,2241.4641,2772.86,2237.4641,2782.86" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2373.78" x2="2393.6432" y1="2760.86" y2="2760.86"/><line style="stroke:#628A5B;stroke-width:1;" x1="2393.6432" x2="2393.6432" y1="2760.86" y2="2782.86"/><polygon fill="#628A5B" points="2389.6432,2772.86,2397.6432,2772.86,2393.6432,2782.86" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2237.4641" x2="2237.4641" y1="2821.088" y2="2839.088"/><line style="stroke:#628A5B;stroke-width:1;" x1="2237.4641" x2="2303.5536" y1="2839.088" y2="2839.088"/><polygon fill="#628A5B" points="2293.5536,2835.088,2303.5536,2839.088,2293.5536,2843.088" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2393.6432" x2="2393.6432" y1="2821.088" y2="2839.088"/><line style="stroke:#628A5B;stroke-width:1;" x1="2393.6432" x2="2327.5536" y1="2839.088" y2="2839.088"/><polygon fill="#628A5B" points="2337.5536,2835.088,2327.5536,2839.088,2337.5536,2843.088" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2315.5536" x2="2315.5536" y1="2728.86" y2="2748.86"/><polygon fill="#628A5B" points="2311.5536,2738.86,2319.5536,2738.86,2315.5536,2748.86" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2315.5536" x2="2315.5536" y1="2851.088" y2="2871.088"/><polygon fill="#628A5B" points="2311.5536,2861.088,2319.5536,2861.088,2315.5536,2871.088" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2430.7793" x2="2444.8344" y1="2941.316" y2="2941.316"/><polygon fill="#628A5B" points="2440.8344,2989.544,2448.8344,2989.544,2444.8344,2999.544" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2444.8344" x2="2444.8344" y1="2941.316" y2="3050.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="2444.8344" x2="2327.5536" y1="3050.658" y2="3050.658"/><polygon fill="#628A5B" points="2337.5536,3046.658,2327.5536,3050.658,2337.5536,3054.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2315.5536" x2="2315.5536" y1="2909.316" y2="2929.316"/><polygon fill="#628A5B" points="2311.5536,2919.316,2319.5536,2919.316,2315.5536,2929.316" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1981.802" x2="1961.9388" y1="4030.668" y2="4030.668"/><line style="stroke:#628A5B;stroke-width:1;" x1="1961.9388" x2="1961.9388" y1="4030.668" y2="4052.668"/><polygon fill="#628A5B" points="1957.9388,4042.668,1965.9388,4042.668,1961.9388,4052.668" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2098.2546" x2="2118.1178" y1="4030.668" y2="4030.668"/><line style="stroke:#628A5B;stroke-width:1;" x1="2118.1178" x2="2118.1178" y1="4030.668" y2="4052.668"/><polygon fill="#628A5B" points="2114.1178,4042.668,2122.1178,4042.668,2118.1178,4052.668" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1961.9388" x2="1961.9388" y1="4090.896" y2="4108.896"/><line style="stroke:#628A5B;stroke-width:1;" x1="1961.9388" x2="2028.0283" y1="4108.896" y2="4108.896"/><polygon fill="#628A5B" points="2018.0283,4104.896,2028.0283,4108.896,2018.0283,4112.896" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2118.1178" x2="2118.1178" y1="4090.896" y2="4108.896"/><line style="stroke:#628A5B;stroke-width:1;" x1="2118.1178" x2="2052.0283" y1="4108.896" y2="4108.896"/><polygon fill="#628A5B" points="2062.0283,4104.896,2052.0283,4108.896,2062.0283,4112.896" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2040.0283" x2="2040.0283" y1="3998.668" y2="4018.668"/><polygon fill="#628A5B" points="2036.0283,4008.668,2044.0283,4008.668,2040.0283,4018.668" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2040.0283" x2="2040.0283" y1="4120.896" y2="4140.896"/><polygon fill="#628A5B" points="2036.0283,4130.896,2044.0283,4130.896,2040.0283,4140.896" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2155.254" x2="2434.5649" y1="4211.124" y2="4211.124"/><polygon fill="#628A5B" points="2430.5649,4263.466,2438.5649,4263.466,2434.5649,4273.466" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2434.5649" x2="2434.5649" y1="4211.124" y2="4328.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="2434.5649" x2="2052.0283" y1="4328.694" y2="4328.694"/><polygon fill="#628A5B" points="2062.0283,4324.694,2052.0283,4328.694,2062.0283,4332.694" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2040.0283" x2="2040.0283" y1="4179.124" y2="4199.124"/><polygon fill="#628A5B" points="2036.0283,4189.124,2044.0283,4189.124,2040.0283,4199.124" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3026.4825" x2="3026.4825" y1="1094.498" y2="1114.498"/><polygon fill="#628A5B" points="3022.4825,1104.498,3030.4825,1104.498,3026.4825,1114.498" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3026.4825" x2="3026.4825" y1="1580.71" y2="1600.71"/><polygon fill="#628A5B" points="3022.4825,1590.71,3030.4825,1590.71,3026.4825,1600.71" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3026.4825" x2="3026.4825" y1="1638.938" y2="1671.28"/><polygon fill="#628A5B" points="3022.4825,1661.28,3030.4825,1661.28,3026.4825,1671.28" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4964.5868" x2="4964.5868" y1="2164.378" y2="2184.378"/><polygon fill="#628A5B" points="4960.5868,2174.378,4968.5868,2174.378,4964.5868,2184.378" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5051.9384" x2="5051.9384" y1="2314.834" y2="2334.834"/><polygon fill="#628A5B" points="5047.9384,2324.834,5055.9384,2324.834,5051.9384,2334.834" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4906.1102" x2="4877.2352" y1="2254.606" y2="2254.606"/><line style="stroke:#628A5B;stroke-width:1;" x1="4877.2352" x2="4877.2352" y1="2254.606" y2="2464.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="4877.2352" x2="4952.5868" y1="2464.062" y2="2464.062"/><polygon fill="#628A5B" points="4942.5868,2460.062,4952.5868,2464.062,4942.5868,2468.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5023.0633" x2="5051.9384" y1="2254.606" y2="2254.606"/><line style="stroke:#628A5B;stroke-width:1;" x1="5051.9384" x2="5051.9384" y1="2254.606" y2="2276.606"/><polygon fill="#628A5B" points="5047.9384,2266.606,5055.9384,2266.606,5051.9384,2276.606" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5051.9384" x2="5051.9384" y1="2373.062" y2="2378.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="5051.9384" x2="4964.5868" y1="2378.062" y2="2378.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="4964.5868" x2="4964.5868" y1="2378.062" y2="2393.062"/><polygon fill="#628A5B" points="4960.5868,2383.062,4968.5868,2383.062,4964.5868,2393.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4964.5868" x2="4964.5868" y1="2222.606" y2="2242.606"/><polygon fill="#628A5B" points="4960.5868,2232.606,4968.5868,2232.606,4964.5868,2242.606" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4964.5868" x2="4964.5868" y1="2106.15" y2="2126.15"/><polygon fill="#628A5B" points="4960.5868,2116.15,4968.5868,2116.15,4964.5868,2126.15" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5019.4356" x2="5216.0505" y1="2405.062" y2="2405.062"/><polygon fill="#628A5B" points="5212.0505,2255.106,5216.0505,2245.106,5220.0505,2255.106" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5216.0505" x2="5216.0505" y1="2094.15" y2="2405.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="5216.0505" x2="4976.5868" y1="2094.15" y2="2094.15"/><polygon fill="#628A5B" points="4986.5868,2090.15,4976.5868,2094.15,4986.5868,2098.15" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4964.5868" x2="4964.5868" y1="2417.062" y2="2452.062"/><polygon fill="#628A5B" points="4960.5868,2442.062,4968.5868,2442.062,4964.5868,2452.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4964.5868" x2="4964.5868" y1="2062.15" y2="2082.15"/><polygon fill="#628A5B" points="4960.5868,2072.15,4968.5868,2072.15,4964.5868,2082.15" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4713.4793" x2="4593.2339" y1="2001.922" y2="2001.922"/><line style="stroke:#628A5B;stroke-width:1;" x1="4593.2339" x2="4593.2339" y1="2001.922" y2="2023.922"/><polygon fill="#628A5B" points="4589.2339,2013.922,4597.2339,2013.922,4593.2339,2023.922" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4844.3414" x2="4964.5868" y1="2001.922" y2="2001.922"/><line style="stroke:#628A5B;stroke-width:1;" x1="4964.5868" x2="4964.5868" y1="2001.922" y2="2023.922"/><polygon fill="#628A5B" points="4960.5868,2013.922,4968.5868,2013.922,4964.5868,2023.922" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4593.2339" x2="4593.2339" y1="2062.15" y2="2494.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="4593.2339" x2="4766.9104" y1="2494.062" y2="2494.062"/><polygon fill="#628A5B" points="4756.9104,2490.062,4766.9104,2494.062,4756.9104,2498.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4964.5868" x2="4964.5868" y1="2476.062" y2="2494.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="4964.5868" x2="4790.9104" y1="2494.062" y2="2494.062"/><polygon fill="#628A5B" points="4800.9104,2490.062,4790.9104,2494.062,4800.9104,2498.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4702.1965" x2="4702.1965" y1="3362.502" y2="3382.502"/><polygon fill="#628A5B" points="4698.1965,3372.502,4706.1965,3372.502,4702.1965,3382.502" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4702.1965" x2="4702.1965" y1="3522.958" y2="3542.958"/><polygon fill="#628A5B" points="4698.1965,3532.958,4706.1965,3532.958,4702.1965,3542.958" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4789.5481" x2="4789.5481" y1="3709.87" y2="3729.87"/><polygon fill="#628A5B" points="4785.5481,3719.87,4793.5481,3719.87,4789.5481,3729.87" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4643.72" x2="4614.8449" y1="3649.642" y2="3649.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="4614.8449" x2="4614.8449" y1="3649.642" y2="3854.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="4614.8449" x2="4690.1965" y1="3854.44" y2="3854.44"/><polygon fill="#628A5B" points="4680.1965,3850.44,4690.1965,3854.44,4680.1965,3858.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4760.673" x2="4789.5481" y1="3649.642" y2="3649.642"/><line style="stroke:#628A5B;stroke-width:1;" x1="4789.5481" x2="4789.5481" y1="3649.642" y2="3671.642"/><polygon fill="#628A5B" points="4785.5481,3661.642,4793.5481,3661.642,4789.5481,3671.642" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4789.5481" x2="4789.5481" y1="3768.098" y2="3773.098"/><line style="stroke:#628A5B;stroke-width:1;" x1="4789.5481" x2="4702.1965" y1="3773.098" y2="3773.098"/><line style="stroke:#628A5B;stroke-width:1;" x1="4702.1965" x2="4702.1965" y1="3773.098" y2="3798.44"/><polygon fill="#628A5B" points="4698.1965,3788.44,4706.1965,3788.44,4702.1965,3798.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4702.1965" x2="4702.1965" y1="3581.186" y2="3637.642"/><polygon fill="#628A5B" points="4698.1965,3627.642,4706.1965,3627.642,4702.1965,3637.642" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4702.1965" x2="4702.1965" y1="3464.73" y2="3484.73"/><polygon fill="#628A5B" points="4698.1965,3474.73,4706.1965,3474.73,4702.1965,3484.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4757.0453" x2="5032.1458" y1="3810.44" y2="3810.44"/><polygon fill="#628A5B" points="5028.1458,3626.914,5032.1458,3616.914,5036.1458,3626.914" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="5032.1458" x2="5032.1458" y1="3452.73" y2="3810.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="5032.1458" x2="4714.1965" y1="3452.73" y2="3452.73"/><polygon fill="#628A5B" points="4724.1965,3448.73,4714.1965,3452.73,4724.1965,3456.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4702.1965" x2="4702.1965" y1="3822.44" y2="3842.44"/><polygon fill="#628A5B" points="4698.1965,3832.44,4706.1965,3832.44,4702.1965,3842.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4702.1965" x2="4702.1965" y1="3420.73" y2="3440.73"/><polygon fill="#628A5B" points="4698.1965,3430.73,4706.1965,3430.73,4702.1965,3440.73" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4445.132" x2="4318.9296" y1="3302.274" y2="3302.274"/><line style="stroke:#628A5B;stroke-width:1;" x1="4318.9296" x2="4318.9296" y1="3302.274" y2="3324.274"/><polygon fill="#628A5B" points="4314.9296,3314.274,4322.9296,3314.274,4318.9296,3324.274" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4575.9941" x2="4702.1965" y1="3302.274" y2="3302.274"/><line style="stroke:#628A5B;stroke-width:1;" x1="4702.1965" x2="4702.1965" y1="3302.274" y2="3324.274"/><polygon fill="#628A5B" points="4698.1965,3314.274,4706.1965,3314.274,4702.1965,3324.274" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4318.9296" x2="4318.9296" y1="3362.502" y2="3884.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="4318.9296" x2="4498.563" y1="3884.44" y2="3884.44"/><polygon fill="#628A5B" points="4488.563,3880.44,4498.563,3884.44,4488.563,3888.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4702.1965" x2="4702.1965" y1="3866.44" y2="3884.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="4702.1965" x2="4522.563" y1="3884.44" y2="3884.44"/><polygon fill="#628A5B" points="4532.563,3880.44,4522.563,3884.44,4532.563,3888.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4510.563" x2="4510.563" y1="3254.886" y2="3290.274"/><polygon fill="#628A5B" points="4506.563,3280.274,4514.563,3280.274,4510.563,3290.274" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4422.9157" x2="4203.0405" y1="3242.886" y2="3242.886"/><polygon fill="#628A5B" points="4199.0405,3789.8765,4207.0405,3789.8765,4203.0405,3799.8765" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4203.0405" x2="4203.0405" y1="3242.886" y2="4401.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="4203.0405" x2="2325.8888" y1="4401.694" y2="4401.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="2325.8888" x2="2325.8888" y1="4401.694" y2="4416.694"/><polygon fill="#628A5B" points="2321.8888,4406.694,2329.8888,4406.694,2325.8888,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="2325.8888" y1="813.674" y2="813.674"/><line style="stroke:#628A5B;stroke-width:1;" x1="2325.8888" x2="2325.8888" y1="813.674" y2="828.674"/><polygon fill="#628A5B" points="2321.8888,818.674,2329.8888,818.674,2325.8888,828.674" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2325.8888" x2="2325.8888" y1="946.586" y2="979.814"/><line style="stroke:#628A5B;stroke-width:1;" x1="2325.8888" 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="3026.4825" y1="1041.27" y2="1041.27"/><line style="stroke:#628A5B;stroke-width:1;" x1="3026.4825" x2="3026.4825" y1="1041.27" y2="1056.27"/><polygon fill="#628A5B" points="3022.4825,1046.27,3030.4825,1046.27,3026.4825,1056.27" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3669.9282" x2="3669.9282" y1="1282.684" y2="1311.355"/><line style="stroke:#628A5B;stroke-width:1;" x1="3669.9282" 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="3669.9282" y1="1217.114" y2="1217.114"/><line style="stroke:#628A5B;stroke-width:1;" x1="3669.9282" x2="3669.9282" y1="1217.114" y2="1244.456"/><polygon fill="#628A5B" points="3665.9282,1234.456,3673.9282,1234.456,3669.9282,1244.456" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3026.4825" x2="3026.4825" y1="1152.726" y2="1157.726"/><line style="stroke:#628A5B;stroke-width:1;" x1="3026.4825" 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="3026.4825" y1="1527.482" y2="1527.482"/><line style="stroke:#628A5B;stroke-width:1;" x1="3026.4825" x2="3026.4825" y1="1527.482" y2="1542.482"/><polygon fill="#628A5B" points="3022.4825,1532.482,3030.4825,1532.482,3026.4825,1542.482" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1444.5642" x2="1444.5642" y1="1969.922" y2="1974.922"/><line style="stroke:#628A5B;stroke-width:1;" x1="1444.5642" x2="4778.9104" y1="1974.922" y2="1974.922"/><line style="stroke:#628A5B;stroke-width:1;" x1="4778.9104" x2="4778.9104" y1="1974.922" y2="1989.922"/><polygon fill="#628A5B" points="4774.9104,1979.922,4782.9104,1979.922,4778.9104,1989.922" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1165.8818" x2="1165.8818" y1="2666.518" y2="2675.632"/><line style="stroke:#628A5B;stroke-width:1;" x1="1165.8818" x2="2315.5536" y1="2675.632" y2="2675.632"/><line style="stroke:#628A5B;stroke-width:1;" x1="2315.5536" x2="2315.5536" y1="2675.632" y2="2690.632"/><polygon fill="#628A5B" points="2311.5536,2680.632,2319.5536,2680.632,2315.5536,2690.632" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2315.5536" x2="2315.5536" y1="2953.316" y2="2966.873"/><line style="stroke:#628A5B;stroke-width:1;" x1="2315.5536" x2="1165.8818" y1="2966.873" y2="2966.873"/><line style="stroke:#628A5B;stroke-width:1;" x1="1165.8818" x2="1165.8818" y1="2966.873" y2="2980.43"/><polygon fill="#628A5B" points="1161.8818,2970.43,1169.8818,2970.43,1165.8818,2980.43" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="1165.8818" x2="1165.8818" y1="3018.658" y2="3025.101"/><line style="stroke:#628A5B;stroke-width:1;" x1="1165.8818" x2="2315.5536" y1="3025.101" y2="3025.101"/><line style="stroke:#628A5B;stroke-width:1;" x1="2315.5536" x2="2315.5536" y1="3025.101" y2="3038.658"/><polygon fill="#628A5B" points="2311.5536,3028.658,2319.5536,3028.658,2315.5536,3038.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2315.5536" x2="2315.5536" y1="3062.658" y2="3066.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="2315.5536" x2="1414.5642" y1="3066.658" y2="3066.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1414.5642" x2="1414.5642" y1="3066.658" y2="3084.658"/><line style="stroke:#628A5B;stroke-width:1;" x1="1414.5642" x2="1432.5642" y1="3084.658" y2="3084.658"/><polygon fill="#628A5B" points="1422.5642,3080.658,1432.5642,3084.658,1422.5642,3088.658" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="4778.9104" x2="4778.9104" y1="2506.062" y2="2511.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="4778.9104" x2="1444.5642" y1="2511.062" y2="2511.062"/><line style="stroke:#628A5B;stroke-width:1;" x1="1444.5642" x2="1444.5642" y1="2511.062" y2="2526.062"/><polygon fill="#628A5B" points="1440.5642,2516.062,1448.5642,2516.062,1444.5642,2526.062" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="3026.4825" x2="3026.4825" y1="1709.508" y2="1736.85"/><line style="stroke:#628A5B;stroke-width:1;" x1="3026.4825" 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="2040.0283" x2="2040.0283" y1="4223.124" y2="4238.738"/><line style="stroke:#628A5B;stroke-width:1;" x1="2040.0283" 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="2040.0283" y1="4301.694" y2="4301.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="2040.0283" x2="2040.0283" y1="4301.694" y2="4316.694"/><polygon fill="#628A5B" points="2036.0283,4306.694,2044.0283,4306.694,2040.0283,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="2040.0283" y1="3946.44" y2="3946.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="2040.0283" x2="2040.0283" y1="3946.44" y2="3960.44"/><polygon fill="#628A5B" points="2036.0283,3950.44,2044.0283,3950.44,2040.0283,3960.44" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2040.0283" x2="2040.0283" y1="4340.694" y2="4344.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="2040.0283" 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="4510.563" x2="4510.563" y1="3896.44" y2="3901.44"/><line style="stroke:#628A5B;stroke-width:1;" x1="4510.563" 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="5347.7566" y1="4384.694" y2="4384.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="5347.7566" x2="5347.7566" y1="3242.886" y2="4384.694"/><line style="stroke:#628A5B;stroke-width:1;" x1="5347.7566" x2="4598.2104" y1="3242.886" y2="3242.886"/><polygon fill="#628A5B" points="4608.2104,3238.886,4598.2104,3242.886,4608.2104,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="4510.563" y1="3215.886" y2="3215.886"/><line style="stroke:#628A5B;stroke-width:1;" x1="4510.563" x2="4510.563" y1="3215.886" y2="3230.886"/><polygon fill="#628A5B" points="4506.563,3220.886,4514.563,3220.886,4510.563,3230.886" style="stroke:#628A5B;stroke-width:1;"/><line style="stroke:#628A5B;stroke-width:1;" x1="2325.8888" x2="2325.8888" y1="4454.922" y2="4464.036"/><line style="stroke:#628A5B;stroke-width:1;" x1="2325.8888" 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="1232.2712" y="78.528">BiergartenPipelineOrchestrator</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="127.3512" x="2299.0007" y="78.528">SqliteExportService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="75.5861" x="3160.4723" y="78.528">JsonLoader</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="125.6712" x="3815.4891" y="78.528">IEnrichmentService</text><text fill="#28342A" font-family="'DM Sans'" font-size="14" lengthAdjust="spacing" textLength="96.6737" x="4818.4772" y="78.528">DataGenerator</text><?plantuml-src hLZhRXit5lwlfo0Ke1YXjcexbsQb80lTd7NMkTHo4YnGGA1cA8dr33abERQdLO4-H9-mJxBVuSn8euiTEwX-o1OlX-VodUySqbv9bNB34sPT7Wjy6ncwB8aRTZKJYHdFOdUgbNlF4y6QmtTip9Ljxbypbhy9TloiDkcaYyLw-sSTNotqTNFV2h_vvAWsDUNXrTpeJ4K37Ml3dfpsJWUd_zf_ThdavENJPoUzVVBlMj0pHj-KaozENlQUzskJxxKJ_MqrHhtJez7BxLNQHCAKAvu_-_7PY-Fw8Q6JrzBb_Q-Qj5hv87b3oHEjeeUBhJRKfUzOlTRspYNZ6vd4N7t5xCrLbmiPNYbXBJjgFsqqV6JOvKAmlXHcpeqJYWsvu-oZJ4KibM3183D6ACV-_lClDivLk31QwSoMoxXRj1gDvPFJazCNfqVBX4lL3iDbmpe8QtG6Hd07wUGN4GqMN2aHlphNyv5o9d_DOZsVXCLejz4Pf_n6qHYBf4sv2nV2CBU0ZEXd5M3NS3NSwLnaAcYrkWs5o3CZvmlNODuKhUASXLg5Nl4mPr91Y61XQKXQcjR1UWxyHZA4Zb5v48iCRB1rpHXN4TREjBdX9h8CGemKbZdDR1gHkfZoHs166cYJgJOslDKu1G8p8zMSsKNc8Wtx-Cp1hBhyCDPMs7P3g8YHEOtEHswiw9bvba2a3RYPXmSCtzSmMCvOqCCfl9fcrpoMqRzRf89YWT8j7Dw1kvX0OXds0yiidmluOQQxcB9EfmqHMmGt5xP5nyfPez4vKzAn3wbGu_4vcyTwocEifVXznyvZdd32E1QFQGpXYcIda_0hCP7g5n4wRO9skxqTaRvKSDaPj9aBSy3EHWeSjo2zny9Sor0SU2Iz4KeO3Xa7s7CskasrMIyu-sXqae9ZJCAT8p5Vn7GGIuhcb5j1qT6A7Huc6Wf6xDgsMQ8Z4HyIVs60VjJTModS3Zq-NraNTJgPahzcOf8wysgT3LKUV3107VYPL7pzEe2LdViNbG3TyeOVOz9P4S-OjCpM4eeIpF8aXQJv0Q1K-OayCY_S8xKw83GouHt4U1op1KyHChBVBI2nG77DM2HdmPRB-nLU5W2Gm1AgmFYdSmczYtEwNiZHg3SwMev_ZJ6n4I3iV2FS9nTUoWJIO09id25au0lhH8Bu2ff25AybIAXRFsd7HVrCna0CXmHX5sowKdfYXOWchpvT3bW4YGuINxUjLuVDP2mKwXlszyWTNe12Ui29p6QpcRnbo1lAKLSf2U-Hgt8OAQsps4hO1x7rsK0ZBqDoDqP7joBC7F9z36Sbd0s7vwIcc1DDN1hKObui_HQN_vG9am_W366_IBSOW2WzkP1RICp9g3ySBDzQhSurX--mPVsZqw6_nUwW6Vg_xLymtIHyUb13lRcmdOu7bWW0c4ciGuyaUu2CgNuSXdJoTYosvwjgxxdl-EYRK7QpGAnOW6HcWeUB0lB8KPYHWyC0uU12K1qXqYni8ZvRFXaEHY-7BvUx3B8akWC2pqjT4JqdRbq0tLl4TnicCVP5Na6nIF8TGMmcgBWGTdp2oT1lQ4wDk84sJI05LeJEfo37k02HexhyxfrZyZzMA_m-C36MaWtv3mPmWHTjAa8v0oPJ47AhpTw1i7RKA3PNRDPYHhZC06jSCG4Qp7sV2ES0VyxdEcEhE92Z7XW8HXc1ggglifJDEAAohY5vuVIoZA3iAKzAQ2jIRm-vjQWWHRN1mZ642bOO8mYK-U_qTS0AqoTX4PK_keMwg3ZuBi4mr4gq7fCsPRaGdwmmDX3bePCIBdUc3ltp4JkquaYOjFnldJ8q3s1wAh7zlCZ6F6ZEgh73QNvO1djprnWHsjfaow5zUpOWEQ8q28dB0VwGaoLbau120Mep5aqBDGGKQK8CMZBgMAXkLiZT1nVgMUGjX4brc8X4cvo84_NILT3nGAQW4liXyWWerG_1teu_lFUaQikU9ix_aMIlm-EUPE-CFIdGZILO-NuopIUb7mz-LcXZIl_Mnrd5LsrfzTFZ5oycnvu22Eaa3Lwv1jBv55fHqrRks-gT7W3xTO8KgZ92OWaj5g2LWFI4WNqZdH0UQIcyzdmq71qlDngUfPyZ1LT3278aAfKeuAkPuaoSEXJ0HmA_MIV3_t0KokzOqHzr_P92Iz-rxMvEVJirYH1NweBooU5hmd3G_3GUNKpUZDwFBdgNPn_UDrlTSiiMXTBdGbWTNnTjyDQ-TaAOiwZrg235OOSuh5tkhP4LVOn8qOIjvA8tc0aJMDywJ8hT1-XWXLdzIFZjn6cqeYXXL-HuIl8tkEqatAnKXgJFr1UNB45B0iDl2b6rLUJvCriW_lD68xsASV515U1Ngz-Rx5SUs4Dt2Ws__xwxCUexag9Bz-0i-t8u3hcAh2piMkyfwB7k7LOcKda0UyMUbkcpKhBiuakWFRG4R22FLBDP6E9-EClYVNxe-EviX8oD0qe-xyreGYbSD1Rn14pbxCg_AwQc9l33h2-DMmH6pUz3bfVcgOc2Dz6poPIsuS8ZgaROj_p51ywR-z0Z4S2Xu00bhi6Tv-Vl3ddc5g2FQ0TvvU_xkzhI0hIjv94B4U8A7H2MYdzN9f07YT2e5V3qlHz1dGi1PtaUcSYeshoB8oG0pd2-8K9M3qWYEnjs6xlWg9QIKc3P_tOgwHNb5CgDRaEH-kY6F8EdgokfzBltQ_ie36rJ9cjkt1_Axg9vbyrhaxPdDeNMO5f8BAWvnIHkdgNuIjW_rcFqqVq9tvFlxpFsSlet5hv7bO6l586xIm0WBP2cui9tPcMxN7ZlxjhGlnXz6LtyRqzvs4dXUcdOtNPlTTYe3HkLuR5reGXRlgyqh0f3RKrH6wR5m4PgFw0ur4l3deJUKnOUMnJMAVBWWh0JbhLxQ67H6lBGQ6lzaVIazVUVVrMMErf4DnZ39JZUFp2OJ9NjrNQmLjNdaTUF1rQUhnFr5arNoHlrDoBw8AhUHzGxn7GVIQ-3LIqhjTZBqT_6q8_avqUmyvwAxDzwOm8AC94Qr5T5BwQuG1qQx-_sQYczm5OlhFGAwwJA02mWXuxUsm9k-dR5tvlNoySMWahCNGIzhp3Szy9rAjN-zwg1JXAwfzLVWZ3gdtIzu-Y5ilwYLBz6RJ-RT_o-hMTnUaVU_ogEoGj_ssD7tOP_rlq_?></g></svg> |