1 line
44 KiB
XML
1 line
44 KiB
XML
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" data-diagram-type="DESCRIPTION" style="width:1613px;height:1750px;background:#FFFFFF;" width="1613px" height="1750px" viewBox="0 0 1613 1750" zoomAndPan="magnify" preserveAspectRatio="none" contentStyleType="text/css"><?plantuml 1.2026.8?><defs><filter id="bhsxtbibe7j5r0" x="0" y="0" width="1" height="1"><feFlood flood-color="#FFF4D6" result="flood"/><feComposite in="SourceGraphic" in2="flood" operator="over"/></filter><filter id="bhsxtbibe7j5r1" x="0" y="0" width="1" height="1"><feFlood flood-color="#BFBFBF" result="flood"/><feComposite in="SourceGraphic" in2="flood" operator="over"/></filter></defs><g font-family="sans-serif" lengthAdjust="spacing"><g class="title" data-source-line="7"><text x="586.961" y="22.995" fill="#000" font-size="14" textLength="432.688" font-weight="700" font-family="Segoe UI">Феникс 6X: часы + телефон атлета + личный сервер</text><text x="605.086" y="39.292" fill="#000" font-size="14" textLength="396.437" font-weight="700" font-family="Segoe UI">(v1.0; серым — v2, жёлтым — внешние системы)</text></g><!--cluster Watch--><g class="cluster" data-qualified-name="Watch" id="ent0001" data-source-line="26"><polygon points="751.409,69.594,761.409,59.594,1042.409,59.594,1042.409,204.494,1032.409,214.494,751.409,214.494,751.409,69.594" fill="none" style="stroke:#181818;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line x1="1032.409" y1="69.594" x2="1042.409" y2="59.594" style="stroke:#181818;stroke-width:1;"/><line x1="751.409" y1="69.594" x2="1032.409" y2="69.594" style="stroke:#181818;stroke-width:1;"/><line x1="1032.409" y1="69.594" x2="1032.409" y2="214.494" style="stroke:#181818;stroke-width:1;"/><text x="849.424" y="83.732" fill="#000" font-size="12" textLength="86.971" font-weight="700" font-family="Segoe UI">Часы атлета</text><text x="821.559" y="97.701" fill="#000" font-size="12" textLength="142.699" font-weight="700" font-family="Segoe UI">(Garmin, Connect IQ)</text></g><!--cluster Phone--><g class="cluster" data-qualified-name="Phone" id="ent0003" data-source-line="30"><polygon points="608.409,301.494,618.409,291.494,1188.409,291.494,1188.409,926.184,1178.409,936.184,608.409,936.184,608.409,301.494" fill="none" style="stroke:#181818;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><line x1="1178.409" y1="301.494" x2="1188.409" y2="291.494" style="stroke:#181818;stroke-width:1;"/><line x1="608.409" y1="301.494" x2="1178.409" y2="301.494" style="stroke:#181818;stroke-width:1;"/><line x1="1178.409" y1="301.494" x2="1178.409" y2="936.184" style="stroke:#181818;stroke-width:1;"/><text x="837.957" y="315.632" fill="#000" font-size="12" textLength="112.904" font-weight="700" font-family="Segoe UI">Телефон атлета</text><text x="837.89" y="329.601" fill="#000" font-size="12" textLength="113.039" font-weight="700" font-family="Segoe UI">(Android, Kotlin)</text></g><!--cluster Server--><g class="cluster" data-qualified-name="Server" id="ent0010" data-source-line="39"><path d="M58.453,1018.456 C79.404,987.348 105.105,987.664 124.865,1019.708 C142.01,991.336 164.044,995.794 179.478,1021.439 C194.696,994.011 225.972,989.005 244.402,1017.726 C265.398,987.786 289.822,984.045 312.535,1015.83 C335,981.731 357.064,983.174 379.518,1015.842 C397.943,981.438 422.379,983.105 446.006,1010.219 C469.114,978.018 496.351,980.908 515.961,1013.969 C533.361,986.375 554.378,987.898 574.881,1010.313 C595.043,973.439 626.247,978.249 646.065,1010.666 C669.135,987.874 690.276,986.968 707.451,1017.458 C728.003,983.419 755.932,979.157 776.971,1016.986 C791.382,990.314 815.351,991.954 832.01,1014.47 C851.354,978.861 881.578,976.878 900.781,1014.602 C922.202,987.282 952.183,984.553 968.409,1020.184 C976.8,1019.346 980.365,1023.038 978.141,1031.406 C1000.844,1044.882 997.599,1069.536 976.049,1081.152 C1007.688,1101.237 1006.229,1123.165 981.318,1147.725 C1015.163,1163.168 1010.632,1184.407 988.738,1206.846 C1018.625,1229.988 1019.654,1250.215 988.144,1272.803 C1014.527,1290.341 1010.32,1309.036 986.282,1324.768 C1014.817,1345.288 1011.133,1370.978 984.502,1389.993 C1011.287,1416.828 1003.97,1439.579 971.74,1454.791 C993.538,1475.966 995.59,1502.956 961.409,1514.434 C966.428,1514.795 969.569,1517.75 966.61,1522.971 C943.417,1550.384 923.092,1555.168 900.382,1522.44 C879.794,1551.761 855.402,1551.581 836.89,1520.266 C817.809,1550.688 786.878,1550.676 767.792,1520.273 C753.287,1551.164 721.958,1555.974 701.113,1527.38 C683.873,1555.877 658.452,1555.103 643.479,1525.145 C622.894,1554.218 597.024,1556.811 576.435,1525.15 C561.978,1556.939 533.353,1559.566 514.935,1529.061 C492.694,1562.489 464.038,1559.027 443.869,1526.818 C428.448,1552.942 398.484,1560.579 382.377,1527.531 C361.546,1556.944 328.487,1556.146 309.436,1525.374 C286.616,1552.172 262.471,1556.892 244.991,1519.973 C226.596,1546.424 199.054,1552.169 181.356,1519.226 C166.545,1553.978 142.933,1549 121.266,1526.411 C91.245,1558.285 54.622,1546.294 41.409,1507.434 C44.482,1507.438 46.216,1509.474 44.536,1512.445 C12.027,1496.52 19.447,1470.196 43.419,1453.207 C20.247,1435.945 21.402,1409.077 48.338,1396.133 C16.196,1380.587 11.301,1347.645 45.785,1329.545 C16.765,1312.674 6,1289.326 37.302,1264.578 C9.739,1248.382 13.763,1220.495 39.699,1206.507 C13.642,1182.364 8.817,1162.579 44.738,1143.384 C18.65,1123.866 23.957,1102.752 48.445,1086.531 C12.657,1065.852 10.609,1033.898 48.409,1013.184 C54.58,1009.618 57.609,1011.874 58.453,1018.456" style="stroke:#181818;stroke-width:1;" fill="none"/><text x="451.656" y="1029.322" fill="#000" font-size="12" textLength="106.506" font-weight="700" font-family="Segoe UI">Личный сервер</text><text x="457.694" y="1043.291" fill="#000" font-size="12" textLength="94.43" font-weight="700" font-family="Segoe UI">(C# / .NET 10)</text></g><!--cluster WebApp--><g class="cluster" data-qualified-name="Server.WebApp" id="ent0011" data-source-line="41"><path d="M59.909,1059.184 L153.903,1059.184 A3.75,3.75 0 0 1 156.403,1061.684 L163.403,1093.121 L479.909,1093.121 A2.5,2.5 0 0 1 482.409,1095.621 L482.409,1190.594 A2.5,2.5 0 0 1 479.909,1193.094 L59.909,1193.094 A2.5,2.5 0 0 1 57.409,1190.594 L57.409,1061.684 A2.5,2.5 0 0 1 59.909,1059.184" style="stroke:#000;stroke-width:1.5;" fill="none"/><line x1="57.409" y1="1093.121" x2="163.403" y2="1093.121" style="stroke:#000;stroke-width:1.5;"/><text x="79.69" y="1072.322" fill="#000" font-size="12" textLength="56.432" font-weight="700" font-family="Segoe UI">WebApp</text><text x="61.409" y="1086.291" fill="#000" font-size="12" textLength="92.994" font-weight="700" font-family="Segoe UI">ASP.NET Core</text></g><!--cluster FitPipeline--><g class="cluster" data-qualified-name="Server.FitPipeline" id="ent0014" data-source-line="46"><path d="M567.909,1254.094 L681.016,1254.094 A3.75,3.75 0 0 1 683.516,1256.594 L690.516,1288.031 L949.909,1288.031 A2.5,2.5 0 0 1 952.409,1290.531 L952.409,1385.494 A2.5,2.5 0 0 1 949.909,1387.994 L567.909,1387.994 A2.5,2.5 0 0 1 565.409,1385.494 L565.409,1256.594 A2.5,2.5 0 0 1 567.909,1254.094" style="stroke:#000;stroke-width:1.5;" fill="none"/><line x1="565.409" y1="1288.031" x2="690.516" y2="1288.031" style="stroke:#000;stroke-width:1.5;"/><text x="589.167" y="1267.232" fill="#000" font-size="12" textLength="72.592" font-weight="700" font-family="Segoe UI">FitPipeline</text><text x="569.409" y="1281.201" fill="#000" font-size="12" textLength="112.107" font-weight="700" font-family="Segoe UI">забор и парсинг</text></g><!--entity DataField--><g class="entity" data-qualified-name="Watch.DataField" id="ent0002" data-source-line="27"><rect x="775.839" y="118.594" width="223.146" height="71.906" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="978.986" y="123.594" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="976.986" y="125.594" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="976.986" y="129.594" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="837.638" y="149.732" fill="#000" font-size="12" textLength="89.549" font-family="Segoe UI">FenixDataField</text><text x="806.554" y="163.701" fill="#000" font-size="12" textLength="151.717" font-family="Segoe UI">поле данных «Феникс»:</text><text x="790.839" y="177.67" fill="#000" font-size="12" textLength="183.146" font-family="Segoe UI">пульс, зоны, подходы, вибро</text></g><!--entity VoiceInput--><g class="entity" data-qualified-name="Phone.VoiceInput" id="ent0004" data-source-line="31"><rect x="885.589" y="350.494" width="259.639" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="1125.228" y="355.494" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="1123.228" y="357.494" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="1123.228" y="361.494" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="978.44" y="381.632" fill="#000" font-size="12" textLength="63.938" font-family="Segoe UI">VoiceInput</text><text x="900.589" y="395.601" fill="#000" font-size="12" textLength="219.639" font-family="Segoe UI">офлайн-STT + грамматика команд</text></g><!--entity TrainingUi--><g class="entity" data-qualified-name="Phone.TrainingUi" id="ent0005" data-source-line="32"><rect x="632.679" y="497.434" width="277.469" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="890.148" y="502.434" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="888.148" y="504.434" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="888.148" y="508.434" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="735.798" y="528.572" fill="#000" font-size="12" textLength="61.23" font-family="Segoe UI">TrainingUi</text><text x="647.679" y="542.541" fill="#000" font-size="12" textLength="237.469" font-family="Segoe UI">экран тренировки, таймеры, история</text></g><!--entity WorkoutCore--><g class="entity" data-qualified-name="Phone.WorkoutCore" id="ent0006" data-source-line="33"><rect x="641.479" y="616.374" width="239.857" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="861.336" y="621.374" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="859.336" y="623.374" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="859.336" y="627.374" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="717.018" y="647.512" fill="#000" font-size="12" textLength="78.779" font-family="Segoe UI">WorkoutCore</text><text x="656.479" y="661.481" fill="#000" font-size="12" textLength="199.857" font-family="Segoe UI">логика тренировки и программ</text></g><!--entity LocalDb--><g class="entity" data-qualified-name="Phone.LocalDb" id="ent0007" data-source-line="34"><rect x="698.449" y="735.314" width="117.924" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="796.373" y="740.314" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="794.373" y="742.314" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="794.373" y="746.314" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="728.326" y="766.452" fill="#000" font-size="12" textLength="48.17" font-family="Segoe UI">LocalDb</text><text x="713.449" y="780.421" fill="#000" font-size="12" textLength="77.924" font-family="Segoe UI">Room/SQLite</text></g><!--entity SyncQueue--><g class="entity" data-qualified-name="Phone.SyncQueue" id="ent0008" data-source-line="35"><rect x="636.089" y="854.244" width="222.643" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="838.732" y="859.244" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="836.732" y="861.244" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="836.732" y="865.244" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="708.238" y="885.382" fill="#000" font-size="12" textLength="68.344" font-family="Segoe UI">SyncQueue</text><text x="651.089" y="899.351" fill="#000" font-size="12" textLength="182.643" font-family="Segoe UI">очередь + идемпотентность</text></g><!--entity WatchChannel--><g class="entity" data-qualified-name="Phone.WatchChannel" id="ent0009" data-source-line="36"><rect x="632.149" y="350.494" width="218.518" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="830.667" y="355.494" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="828.667" y="357.494" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="828.667" y="361.494" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="692.712" y="381.632" fill="#000" font-size="12" textLength="87.393" font-family="Segoe UI">WatchChannel</text><text x="647.149" y="395.601" fill="#000" font-size="12" textLength="178.518" font-family="Segoe UI">companion-канал Connect IQ</text></g><!--entity MetricsEngine--><g class="entity" data-qualified-name="Server.MetricsEngine" id="ent0017" data-source-line="51"><rect x="352.249" y="1307.074" width="194.318" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="526.567" y="1312.074" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="524.567" y="1314.074" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="524.567" y="1318.074" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="402.065" y="1338.212" fill="#000" font-size="12" textLength="84.686" font-family="Segoe UI">MetricsEngine</text><text x="367.249" y="1352.181" fill="#000" font-size="12" textLength="154.318" font-family="Segoe UI">adherence, тоннаж, 1ПМ</text></g><!--entity ProgressionRules--><g class="entity" data-qualified-name="Server.ProgressionRules" id="ent0018" data-source-line="52"><rect x="501.439" y="1112.174" width="215.945" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="697.384" y="1117.174" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="695.384" y="1119.174" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="695.384" y="1123.174" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="552.84" y="1143.312" fill="#000" font-size="12" textLength="103.143" font-family="Segoe UI">ProgressionRules</text><text x="516.439" y="1157.281" fill="#000" font-size="12" textLength="175.945" font-family="Segoe UI">правила прогрессии → draft</text></g><!--entity ProgramStore--><g class="entity" data-qualified-name="Server.ProgramStore" id="ent0019" data-source-line="53"><rect x="123.899" y="1307.074" width="193.023" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="296.922" y="1312.074" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="294.922" y="1314.074" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="294.922" y="1318.074" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="173.868" y="1338.212" fill="#000" font-size="12" textLength="83.086" font-family="Segoe UI">ProgramStore</text><text x="138.899" y="1352.181" fill="#000" font-size="12" textLength="153.023" font-family="Segoe UI">версии программ (JSON)</text></g><!--entity Db--><g class="entity" data-qualified-name="Server.Db" id="ent0020" data-source-line="55"><path d="M170.799,1459.494 C170.799,1449.494 220.408,1449.494 220.408,1449.494 C220.408,1449.494 270.018,1449.494 270.018,1459.494 L270.018,1496.431 C270.018,1506.431 220.408,1506.431 220.408,1506.431 C220.408,1506.431 170.799,1506.431 170.799,1496.431 L170.799,1459.494" style="stroke:#7A8899;stroke-width:0.5;" fill="#F5F7FA"/><path d="M170.799,1459.494 C170.799,1469.494 220.408,1469.494 220.408,1469.494 C220.408,1469.494 270.018,1469.494 270.018,1459.494" style="stroke:#7A8899;stroke-width:0.5;" fill="none"/><text x="185.8" y="1484.632" fill="#000" font-size="12" textLength="69.217" font-family="Segoe UI">PostgreSQL</text><text x="180.799" y="1498.601" fill="#000" font-size="12" textLength="79.219" font-family="Segoe UI">слои src | ref</text></g><!--entity RestApi--><g class="entity" data-qualified-name="Server.WebApp.RestApi" id="ent0012" data-source-line="42"><rect x="270.659" y="1105.184" width="195.496" height="71.906" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="446.155" y="1110.184" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="444.155" y="1112.184" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="444.155" y="1116.184" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="340.488" y="1136.322" fill="#000" font-size="12" textLength="45.838" font-family="Segoe UI">RestApi</text><text x="285.659" y="1150.291" fill="#000" font-size="12" textLength="155.496" font-family="Segoe UI">sync, workouts, programs</text><text x="305.751" y="1164.26" fill="#000" font-size="12" textLength="115.313" font-family="Segoe UI">(X-Api-Key атлета)</text></g><!--entity AdminWeb--><g class="entity" data-qualified-name="Server.WebApp.AdminWeb" id="ent0013" data-source-line="43"><rect x="72.919" y="1105.184" width="162.971" height="71.906" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="215.89" y="1110.184" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="213.89" y="1112.184" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="213.89" y="1116.184" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="116.744" y="1136.322" fill="#000" font-size="12" textLength="65.32" font-family="Segoe UI">AdminWeb</text><text x="87.919" y="1150.291" fill="#000" font-size="12" textLength="122.971" font-family="Segoe UI">консоль владельца</text><text x="101.771" y="1164.26" fill="#000" font-size="12" textLength="95.268" font-family="Segoe UI">(логин/пароль)</text></g><!--entity FitFetcher--><g class="entity" data-qualified-name="Server.FitPipeline.FitFetcher" id="ent0015" data-source-line="47"><rect x="750.209" y="1300.094" width="186.396" height="71.906" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="916.606" y="1305.094" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="914.606" y="1307.094" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="914.606" y="1311.094" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="808.182" y="1331.232" fill="#000" font-size="12" textLength="60.451" font-family="Segoe UI">FitFetcher</text><text x="765.209" y="1345.201" fill="#000" font-size="12" textLength="146.396" font-family="Segoe UI">клиент Garmin Connect</text><text x="779.061" y="1359.17" fill="#000" font-size="12" textLength="118.693" font-family="Segoe UI">(+ папка импорта)</text></g><!--entity FitParser--><g class="entity" data-qualified-name="Server.FitPipeline.FitParser" id="ent0016" data-source-line="48"><rect x="581.239" y="1307.074" width="134.342" height="57.938" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="695.581" y="1312.074" width="15" height="10" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="693.581" y="1314.074" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="693.581" y="1318.074" width="4" height="2" fill="#F5F7FA" style="stroke:#7A8899;stroke-width:0.5;"/><text x="616.893" y="1338.212" fill="#000" font-size="12" textLength="53.033" font-family="Segoe UI">FitParser</text><text x="596.239" y="1352.181" fill="#000" font-size="12" textLength="94.342" font-family="Segoe UI">Garmin FIT SDK</text></g><!--entity LlmPlanner--><g class="entity" data-qualified-name="LlmPlanner" id="ent0021" data-source-line="58"><rect x="992.489" y="1112.174" width="211.844" height="57.938" fill="#BFBFBF" style="stroke:#7A8899;stroke-width:0.5;" rx="2.5" ry="2.5"/><rect x="1184.333" y="1117.174" width="15" height="10" fill="#BFBFBF" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="1182.333" y="1119.174" width="4" height="2" fill="#BFBFBF" style="stroke:#7A8899;stroke-width:0.5;"/><rect x="1182.333" y="1123.174" width="4" height="2" fill="#BFBFBF" style="stroke:#7A8899;stroke-width:0.5;"/><text x="1059.831" y="1143.312" fill="#000" font-size="12" textLength="67.16" font-family="Segoe UI">LlmPlanner</text><text x="1007.489" y="1157.281" fill="#000" font-size="12" textLength="171.844" font-family="Segoe UI">еженедельный контур LLM</text></g><!--entity GarminConnect--><g class="entity" data-qualified-name="GarminConnect" id="ent0022" data-source-line="60"><path d="M1002.505,1457.125 C1005.109,1450.788 1009.762,1451.275 1013.6,1455.873 C1016.262,1450.205 1020.012,1449.602 1023.961,1454.626 C1026.034,1449.603 1030.883,1448.369 1034.508,1452.914 C1036.698,1446.984 1041.721,1445.904 1045.68,1451.146 C1049.339,1444.223 1053.257,1445.366 1057.999,1449.99 C1062.3,1444.371 1065.707,1444.397 1069.249,1450.706 C1073.285,1447.596 1077.566,1448.924 1079.14,1453.768 C1082.945,1449.197 1087.394,1448.556 1090.525,1454.497 C1094.95,1448.523 1099.27,1449.226 1102.633,1455.543 C1106.941,1450.649 1111.514,1453.081 1113.407,1458.153 C1124.436,1462.065 1126.463,1470.315 1117.281,1478.144 C1127.948,1486.906 1125.99,1494.296 1114.075,1499.698 C1111.123,1505.272 1107.255,1506.285 1102.348,1502.032 C1099.965,1507.938 1094.219,1507.854 1090.698,1503.299 C1087.866,1507.714 1084.503,1509.028 1080.658,1504.428 C1076.855,1509.696 1073.263,1510.661 1068.772,1505.188 C1066.377,1511.715 1062.851,1511.735 1057.859,1507.932 C1052.248,1513.346 1048.78,1511.143 1046.043,1504.995 C1041.613,1509.784 1037.88,1508.462 1034.992,1503.285 C1032.357,1507.83 1027.807,1507.86 1024.768,1503.763 C1019.936,1507.419 1015.575,1506.637 1013.715,1500.432 C1009.996,1506.419 1005.245,1505.959 1001.32,1500.658 C995.257,1498.404 994.231,1494.422 998.335,1489.458 C991.635,1489.061 989.311,1485.329 992.613,1479.298 C988.364,1473.71 990.444,1469.016 997.219,1467.87 C993.627,1462.311 995.903,1457.669 1002.505,1457.125" style="stroke:#181818;stroke-width:0.5;" fill="#FFF4D6"/><text x="1007.589" y="1475.132" fill="#000" font-size="12" textLength="97.646" font-family="Segoe UI">Garmin Connect</text><text x="1017.699" y="1489.101" fill="#000" font-size="12" textLength="77.426" font-family="Segoe UI">(облако, .fit)</text></g><g class="entity" data-qualified-name="GMN40" id="ent0041" data-source-line="91"><path d="M1220.119,353.514 L1220.119,405.42 L1554.689,405.42 L1554.689,363.514 L1544.689,353.514 L1220.119,353.514" style="stroke:#181818;stroke-width:0.5;" fill="#FEFFDD"/><path d="M1544.689,353.514 L1544.689,363.514 L1554.689,363.514 L1544.689,353.514" style="stroke:#181818;stroke-width:1;" fill="#FEFFDD"/><text x="1230.47" y="369.652" fill="#000" font-size="12" textLength="304.869" font-family="Segoe UI">Инвариант: часы автономны — запись .fit ведёт</text><text x="1226.119" y="383.621" fill="#000" font-size="12" textLength="313.57" font-family="Segoe UI">платформа Garmin, поле — только отображение.</text><text x="1238.849" y="397.59" fill="#000" font-size="12" textLength="288.111" font-family="Segoe UI">Один код поля — сборки под модели Garmin.</text></g><g class="entity" data-qualified-name="GMN43" id="ent0044" data-source-line="97"><path d="M1220.199,507.434 L1220.199,545.371 L1598.609,545.371 L1598.609,517.434 L1588.609,507.434 L1220.199,507.434" style="stroke:#181818;stroke-width:0.5;" fill="#FEFFDD"/><path d="M1588.609,507.434 L1588.609,517.434 L1598.609,517.434 L1588.609,507.434" style="stroke:#181818;stroke-width:1;" fill="#FEFFDD"/><text x="1229.088" y="523.572" fill="#000" font-size="12" textLength="351.633" font-family="Segoe UI">Инвариант офлайн-first: все данные сначала в LocalDb;</text><text x="1226.199" y="537.541" fill="#000" font-size="12" textLength="357.41" font-family="Segoe UI">сеть — только SyncQueue. Каждой записи — client_guid.</text></g><g class="entity" data-qualified-name="GMN46" id="ent0047" data-source-line="102"><path d="M55.739,1577.434 L55.739,1615.371 A0,0 0 0 0 55.739,1615.371 L385.083,1615.371 A0,0 0 0 0 385.083,1615.371 L385.083,1587.434 L375.083,1577.434 L224.409,1577.434 L220.409,1506.854 L216.409,1577.434 L55.739,1577.434 A0,0 0 0 0 55.739,1577.434" style="stroke:#181818;stroke-width:0.5;" fill="#FEFFDD"/><path d="M375.083,1577.434 L375.083,1587.434 L385.083,1587.434 L375.083,1577.434" style="stroke:#181818;stroke-width:0.5;" fill="#FEFFDD"/><text x="61.739" y="1593.572" fill="#000" font-size="12" textLength="308.344" font-family="Segoe UI">Инвариант изоляции атлетов: ключ → athlete_id,</text><text x="133.534" y="1607.541" fill="#000" font-size="12" textLength="164.754" font-family="Segoe UI">все выборки — по атлету.</text></g><!--link DataField to WatchChannel--><g class="link" data-entity-1="ent0002" data-entity-2="ent0009" id="lnk23" data-source-line="64" data-link-type="dependency"><path d="M864.279,190.864 C835.409,234.944 789.359,305.261 762.769,345.851" style="stroke:#444;stroke-width:1;" fill="none" id="DataField-to-WatchChannel"/><polygon points="760.029,350.034,768.307,344.697,762.769,345.851,761.615,340.313,760.029,350.034" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="841.676" y="250.632" fill="#000" font-size="12" textLength="78.773" font-family="Segoe UI">пульс, зоны,</text><text x="832.779" y="264.601" fill="#000" font-size="12" textLength="96.568" font-family="Segoe UI">таймер отдыха</text></g><!--link WatchChannel to TrainingUi--><g class="link" data-entity-1="ent0009" data-entity-2="ent0005" id="lnk24" data-source-line="65" data-link-type="dependency"><path d="M747.269,408.754 C752.549,434.294 759.276,466.778 764.556,492.288" style="stroke:#444;stroke-width:1;" fill="none" id="WatchChannel-to-TrainingUi"/><polygon points="765.569,497.184,767.662,487.56,764.556,492.288,759.828,489.181,765.569,497.184" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="777.671" y="450.572" fill="#000" font-size="12" textLength="73.682" font-family="Segoe UI">live-данные</text><text x="760.099" y="464.541" fill="#000" font-size="12" textLength="108.826" font-family="Segoe UI">(если связь есть)</text></g><!--link VoiceInput to TrainingUi--><g class="link" data-entity-1="ent0004" data-entity-2="ent0005" id="lnk25" data-source-line="66" data-link-type="dependency"><path d="M972.019,408.784 C945.049,426.134 909.509,448.564 877.409,467.434 C860.499,477.374 846.201,485.394 829.271,494.604" style="stroke:#444;stroke-width:1;" fill="none" id="VoiceInput-to-TrainingUi"/><polygon points="824.879,496.994,834.696,496.207,829.271,494.604,830.873,489.179,824.879,496.994" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="924.429" y="457.572" fill="#000" font-size="12" textLength="56.613" font-family="Segoe UI">команды</text></g><!--link TrainingUi to WorkoutCore--><g class="link" data-entity-1="ent0005" data-entity-2="ent0006" id="lnk26" data-source-line="67" data-link-type="dependency"><path d="M768.989,555.714 C767.429,573.964 765.837,592.632 764.267,610.912" style="stroke:#444;stroke-width:1;" fill="none" id="TrainingUi-to-WorkoutCore"/><polygon points="763.839,615.894,768.595,607.269,764.267,610.912,760.624,606.584,763.839,615.894" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link WorkoutCore to LocalDb--><g class="link" data-entity-1="ent0006" data-entity-2="ent0007" id="lnk27" data-source-line="68" data-link-type="dependency"><path d="M760.439,674.654 C759.819,692.904 759.181,711.557 758.551,729.827" style="stroke:#444;stroke-width:1;" fill="none" id="WorkoutCore-to-LocalDb"/><polygon points="758.379,734.824,762.687,725.967,758.551,729.827,754.692,725.691,758.379,734.824" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link LocalDb to SyncQueue--><g class="link" data-entity-1="ent0007" data-entity-2="ent0008" id="lnk28" data-source-line="69" data-link-type="dependency"><path d="M754.989,793.584 C753.429,811.834 751.837,830.502 750.267,848.782" style="stroke:#444;stroke-width:1;" fill="none" id="LocalDb-to-SyncQueue"/><polygon points="749.839,853.764,754.595,845.139,750.267,848.782,746.624,844.454,749.839,853.764" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link SyncQueue to RestApi--><g class="link" data-entity-1="ent0008" data-entity-2="ent0012" id="lnk29" data-source-line="70" data-link-type="dependency"><path d="M639.359,912.584 C584.809,930.604 519.899,958.044 470.409,997.184 C433.219,1026.594 405.988,1068.642 388.438,1100.562" style="stroke:#444;stroke-width:1;" fill="none" id="SyncQueue-to-RestApi"/><polygon points="386.029,1104.944,393.87,1098.984,388.438,1100.562,386.86,1095.13,386.029,1104.944" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="539.982" y="972.322" fill="#000" font-size="12" textLength="38.537" font-family="Segoe UI">HTTPS</text><text x="525.729" y="986.291" fill="#000" font-size="12" textLength="67.043" font-family="Segoe UI">POST /sync</text></g><!--link FitFetcher to GarminConnect--><g class="link" data-entity-1="ent0015" data-entity-2="ent0022" id="lnk30" data-source-line="71" data-link-type="dependency"><path d="M897.159,1372.354 C933.149,1395.994 975.7,1423.949 1009.22,1445.969" style="stroke:#444;stroke-width:1;" fill="none" id="FitFetcher-to-GarminConnect"/><polygon points="1013.399,1448.714,1008.073,1440.429,1009.22,1445.969,1003.681,1447.115,1013.399,1448.714" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="963.659" y="1416.132" fill="#000" font-size="12" textLength="115.805" font-family="Segoe UI">.fit по расписанию</text></g><!--link FitParser to Db--><g class="link" data-entity-1="ent0016" data-entity-2="ent0020" id="lnk31" data-source-line="72" data-link-type="dependency"><path d="M622.469,1365.464 C610.059,1377.094 594.249,1389.364 577.409,1395.994 C548.829,1407.264 469.729,1399.044 439.409,1403.994 C364.389,1416.264 345.219,1421.364 274.409,1448.994 C273.029,1449.534 276.257,1448.152 274.857,1448.742" style="stroke:#444;stroke-width:1;" fill="none" id="FitParser-to-Db"/><polygon points="270.249,1450.684,280.096,1450.875,274.857,1448.742,276.989,1443.503,270.249,1450.684" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="440.409" y="1416.132" fill="#000" font-size="12" textLength="83.824" font-family="Segoe UI">workout_facts</text></g><!--link MetricsEngine to Db--><g class="link" data-entity-1="ent0017" data-entity-2="ent0020" id="lnk32" data-source-line="73" data-link-type="dependency"><path d="M403.069,1365.364 C363.079,1389.794 309.906,1422.287 270.166,1446.567" style="stroke:#444;stroke-width:1;" fill="none" id="MetricsEngine-to-Db"/><polygon points="265.899,1449.174,275.664,1447.895,270.166,1446.567,271.494,1441.068,265.899,1449.174" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link ProgressionRules to ProgramStore--><g class="link" data-entity-1="ent0018" data-entity-2="ent0019" id="lnk33" data-source-line="74" data-link-type="dependency"><path d="M555.509,1170.464 C533.329,1181.244 507.089,1192.884 482.409,1201.094 C466.029,1206.534 460.739,1203.514 444.409,1209.094 C416.379,1218.654 412.669,1229.214 384.409,1238.094 C362.939,1244.834 355.039,1237.114 334.409,1246.094 C301.499,1260.424 273.428,1283.085 251.848,1303.305" style="stroke:#444;stroke-width:1;" fill="none" id="ProgressionRules-to-ProgramStore"/><polygon points="248.199,1306.724,257.502,1303.489,251.848,1303.305,252.032,1297.651,248.199,1306.724" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="445.409" y="1228.232" fill="#000" font-size="12" textLength="76.852" font-family="Segoe UI">draft-версия</text></g><!--link ProgramStore to Db--><g class="link" data-entity-1="ent0019" data-entity-2="ent0020" id="lnk34" data-source-line="75" data-link-type="dependency"><path d="M220.409,1365.364 C220.409,1389.794 220.409,1419.894 220.409,1444.174" style="stroke:#444;stroke-width:1;" fill="none" id="ProgramStore-to-Db"/><polygon points="220.409,1449.174,224.409,1440.174,220.409,1444.174,216.409,1440.174,220.409,1449.174" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link RestApi to Db--><g class="link" data-entity-1="ent0012" data-entity-2="ent0020" id="lnk35" data-source-line="76" data-link-type="dependency"><path d="M304.269,1177.544 C287.949,1185.854 270.249,1194.264 253.409,1201.094 C190.099,1226.774 147.039,1191.164 106.409,1246.094 C66.789,1299.654 75.839,1336.794 106.409,1395.994 C119.999,1422.314 142.147,1439.508 166.197,1452.848" style="stroke:#444;stroke-width:1;" fill="none" id="RestApi-to-Db"/><polygon points="170.569,1455.274,164.639,1447.41,166.197,1452.848,160.758,1454.406,170.569,1455.274" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link AdminWeb to Db--><g class="link" data-entity-1="ent0013" data-entity-2="ent0020" id="lnk36" data-source-line="77" data-link-type="dependency"><path d="M101.909,1177.564 C92.379,1186.634 83.769,1197.234 78.409,1209.094 C39.999,1294.114 26.379,1341.564 78.409,1418.994 C98.829,1449.394 133.39,1462.806 165.54,1469.696" style="stroke:#444;stroke-width:1;" fill="none" id="AdminWeb-to-Db"/><polygon points="170.429,1470.744,162.467,1464.947,165.54,1469.696,160.791,1472.769,170.429,1470.744" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/></g><!--link RestApi to ProgramStore--><g class="link" data-entity-1="ent0012" data-entity-2="ent0019" id="lnk37" data-source-line="78" data-link-type="dependency"><path d="M341.259,1177.524 C312.719,1214.724 271.433,1268.537 245.133,1302.817" style="stroke:#444;stroke-width:1;" fill="none" id="RestApi-to-ProgramStore"/><polygon points="242.089,1306.784,250.741,1302.078,245.133,1302.817,244.394,1297.208,242.089,1306.784" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="317.309" y="1221.232" fill="#000" font-size="12" textLength="58.881" font-family="Segoe UI">активная</text><text x="324.906" y="1235.201" fill="#000" font-size="12" textLength="43.688" font-family="Segoe UI">версия</text></g><!--link LlmPlanner to MetricsEngine--><g class="link" data-entity-1="ent0021" data-entity-2="ent0017" id="lnk38" data-source-line="79" data-link-type="dependency"><path d="M1059.009,1170.484 C1024.379,1193.594 971.659,1224.544 920.409,1238.094 C882.269,1248.174 602.629,1232.994 565.409,1246.094 C530.459,1258.394 501.226,1282.111 479.486,1303.221" style="stroke:#444;stroke-width:1;stroke-dasharray:7,7;" fill="none" id="LlmPlanner-to-MetricsEngine"/><polygon points="475.899,1306.704,485.142,1303.304,479.486,1303.221,479.569,1297.564,475.899,1306.704" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="993.299" y="1221.232" fill="#000" font-size="12" textLength="94.102" font-family="Segoe UI">сводка недели</text><text x="1028.3" y="1235.201" fill="#000" font-size="12" textLength="24.1" font-family="Segoe UI">(v2)</text></g><!--link LlmPlanner to ProgramStore--><g class="link" data-entity-1="ent0021" data-entity-2="ent0019" id="lnk39" data-source-line="80" data-link-type="dependency"><path d="M1050.839,1170.594 C1028.949,1182.224 1002.159,1194.484 976.409,1201.094 C943.429,1209.554 857.359,1206.524 823.409,1209.094 C692.919,1218.954 660.949,1228.974 530.409,1238.094 C508.669,1239.614 354.869,1238.584 334.409,1246.094 C299.999,1258.714 271.323,1282.367 249.973,1303.377" style="stroke:#444;stroke-width:1;stroke-dasharray:7,7;" fill="none" id="LlmPlanner-to-ProgramStore"/><polygon points="246.409,1306.884,255.63,1303.422,249.973,1303.377,250.018,1297.72,246.409,1306.884" fill="#444" style="stroke:#444;stroke-width:1;stroke-linejoin:miter;stroke-miterlimit:10;"/><text x="824.409" y="1221.232" fill="#000" font-size="12" textLength="87.375" font-family="Segoe UI">предложение</text><text x="856.047" y="1235.201" fill="#000" font-size="12" textLength="24.1" font-family="Segoe UI">(v2)</text></g><!--link Watch to GMN40--><g class="link" data-entity-1="ent0001" data-entity-2="ent0041" id="lnk42" data-source-line="91" data-link-type="association"><path d="M1042.517,160.665 C1042.694,160.777 1042.874,160.891 1043.057,161.006 C1043.787,161.467 1044.559,161.955 1045.374,162.469 C1051.889,166.583 1061.065,172.377 1072.241,179.435 C1094.595,193.551 1124.953,212.722 1158.043,233.618 C1224.222,275.409 1301.324,324.099 1347.159,353.044" style="stroke:#444;stroke-width:1;stroke-dasharray:7,7;" fill="none" id="Watch-GMN40"/></g><!--link Phone to GMN43--><g class="link" data-entity-1="ent0003" data-entity-2="ent0044" id="lnk45" data-source-line="97" data-link-type="association"><path d="M1188.438,392.727 C1188.57,392.908 1188.703,393.09 1188.837,393.272 C1189.374,394.002 1189.93,394.743 1190.505,395.491 C1191.654,396.986 1192.875,398.507 1194.154,400.009 C1196.712,403.012 1199.502,405.939 1202.409,408.434 C1252.999,451.854 1322.139,487.044 1366.289,507.104" style="stroke:#444;stroke-width:1;stroke-dasharray:7,7;" fill="none" id="Phone-GMN43"/></g><g class="legend" data-source-line="82"><rect x="617.685" y="1636.371" width="371.238" height="95.484" fill="none" style="stroke:#000;stroke-width:1;" rx="7.5" ry="7.5"/><text x="627.559" y="1656.366" fill="#000" font-size="14" textLength="45.11" font-weight="700" font-family="Segoe UI">Связь</text><text x="695.461" y="1656.366" fill="#000" font-size="14" textLength="77.15" font-weight="700" font-family="Segoe UI">Значение</text><text x="622.685" y="1672.663" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="627.136" y="1672.663" fill="#000" font-size="14" textLength="50.572" font-family="monospace">A -> B</text><text x="677.708" y="1672.663" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="695.037" y="1672.663" fill="#000" font-size="14" textLength="205.406" font-family="Segoe UI">A зависит от / использует B</text><text x="622.685" y="1688.96" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="627.136" y="1688.96" fill="#000" font-size="14" textLength="59.001" font-family="monospace">A ..> B</text><text x="686.137" y="1688.96" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="695.037" y="1688.96" fill="#000" font-size="14" textLength="284.437" font-family="Segoe UI">связь версии v2 (в v1 не реализована)</text><text x="622.685" y="1705.257" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="627.136" y="1705.257" fill="#000" font-size="14" textLength="58.481" font-family="Segoe UI" filter="url(#bhsxtbibe7j5r0)">жёлтый</text><text x="685.617" y="1705.257" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="695.037" y="1705.257" fill="#000" font-size="14" textLength="129.678" font-family="Segoe UI">внешняя система</text><text x="622.685" y="1721.554" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="627.136" y="1721.554" fill="#000" font-size="14" textLength="45.35" font-family="Segoe UI" filter="url(#bhsxtbibe7j5r1)">серый</text><text x="672.485" y="1721.554" fill="#000" font-size="14" font-family="Segoe UI"> </text><text x="695.037" y="1721.554" fill="#000" font-size="14" textLength="131.858" font-family="Segoe UI">задумано, не в v1</text><line x1="622.685" y1="1643.371" x2="983.924" y2="1643.371" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1659.668" x2="983.924" y2="1659.668" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1675.965" x2="983.924" y2="1675.965" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1692.262" x2="983.924" y2="1692.262" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1708.559" x2="983.924" y2="1708.559" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1724.856" x2="983.924" y2="1724.856" style="stroke:#000;stroke-width:1;"/><line x1="622.685" y1="1643.371" x2="622.685" y2="1724.856" style="stroke:#000;stroke-width:1;"/><line x1="690.587" y1="1643.371" x2="690.587" y2="1724.856" style="stroke:#000;stroke-width:1;"/><line x1="983.924" y1="1643.371" x2="983.924" y2="1724.856" style="stroke:#000;stroke-width:1;"/></g><?plantuml-src hLXTRzDM6BxthtXLBg0YQG6nmGfK2cNP65-1P8EBIiYDJrCBnuvifumD95eOJ89HCKtQj4zjchQBtOJGGA1jAkqNs7-1NxBdVOyJsqctYub2W-FpVf_tUSvxs4-dtkAFiP-YtwDUj1FrezVn6hrxZTxS_OPMxCOAEMfLEMIfm6wuT23QX4WdUXxVnUSs_dH87bz6tQWNtutNuqTuwh2bU6DwXWt_50tYzQWJF-1NSrIYuZoT5llGwa2w7w_XTtrM7dQZGRGLFuvUnlTWSFq4v4_EZpGWC408y1Iz41r8xKe0NMXji8Ru_4F2WLSwO1Kjlr4yEZr7qOluAQGun5Uqhrmk7ptphewZYtXxyPVy6VLEi1VEHSHEb_cF5iCoP6drCFjug_KtGZjqrFWcp57y48LRYn_HGK8slMWBWTr72NO8xzVbAoTvaF3OX_2E1AtZrpkow1v0l8SoIMrBCgj72jc2R8yNeezSPL_MnF5s_6ZQC88RjjioVRD9mOffUJTjjq7BfXEep8gbbiss4zRKfs79GSyqbHjI7H_ApqWjcVKR3TzhkzQ2vtY-R0T-9ksKFJUyQ3OLLLN3K_JnsRr5glPdYWuVoIoMVD-xcHW_AZ-PnRhNR7akH_QvGNHw8fXtoiVA9LxnV4lvoTjZfUF7ttlFk9EDm0pD9JDG_ykC4NeD5Que7zg6wrcAfg8_a_tERY-sy0FJRzfkWHOyrrNraCvUdfuYCw2hPbXV4UTfHbDbvTgVda5aPLivrgAhCSMzkod8H9F4Nz3VVsMxxU-jEHO4d02-UAt0s1om99vOVJF-GZxvEn0RFKD_3II4aIFEACdYjtzjLUHISYtViwq2dVD2ntPr8fKL13-Uo2UUNLTdtLOxH6m3MDj2_A-YdMArLkEUpx0GR2CFG04V0tw1n3R5SceaRxpccxQB1lxONdJZhr03jhK3cE51oi8P8jVNKR_0u6FFsnf2g876nG0o83NnazhB-xdg-JUyThZW-GfPRC7cyoJKlLmH_zsLxwFiz4wdPlBsptjrqpcpjEXUyRpcRFNoUJjKef4ivAMhjzpwvRPgAwdeG-697lRrCTUppzGAZxl2s8WCdpjuHghnOx4vKX_BaTjmOSL4SpgBBY-OhksvHKuJ5ZhHLgPpqyPDDBXnwexNjj0vF_mxZItiercQkVX-ZGuVqarJLVwgHWzH2-0p6sY-gsgfr6ejkgLgHOIvOjgbB4YFvOA_eeAmr48N14YkG3TreOC2jNol0P07y7sj28dYENKhrymwYaH_t6p90cBX4uL-BL1QqoSRuuVxc4lDM7iWe1Wrniuioj-H1i2gzZ0q1HTtShcMxR1YjnHGnFl9f-apxadTH6o56HmRy5pCPAGdgu35iiAUA5y2tk83W1k0DFKCzm-X7XJR-1MuzPD-kPiM93MrXvEAwGVi8p5RFbkZwfbpe_XaTPXdHlE22dsx7hplDYHNqu9rvTQLG7F0f8QGNXJeSFHBzADOosdaZLLuOrKGe4Mlj1qL2FFf8QBFUvD5O0_TpqNiqvi7NvFbcykX9gmn6tjuC9lLKADUpqRQp3YwwS17rKiNfrEZYHeNO7IyJ5My88G_m1jijIRTqgV0hzDjyjMo9k8b0LA66PncnM64yPRsC33rPC196Yy1MTASw_4zzCtvynSqTOmqXmFG2A4JxG3rPzBGC5IWcMKxrBbemI7iat6B8zm_CVkX348oI6cMybEWy697poF6wAYX8YR2B8NG7ErvUA5O6UOcuRLDFlwYZf7JPuCfWyESOw-gOdfWHZrEjIUbxpCpTJ5jlcGqzpGzJXlfGJDfBNignO-Cp9faak7spBEi3Lay-LVUfImyUfBt2HF1tuUrMgMww5OkLMiqoxncfA0KqVpkpCc-oKaluxpi0E-37kIV62DeYZB2c1lovFLbinu6HWvjYP0nZX5vd-rnc1545LE4n1j6JY8nDKmj-JfanBsMnnnmPyfqmBDj9zx8mX7ECgq-CpEVPmreyqxBbKF8RWIVgCzpzP7fSVLntxlwU1MylaYchLwYQZYgeLoBbhmmz9h6xLCK_JfgA_xshGJySAX6jutRD3MbxqzJKq1-QUm69Vqz0I5zaS85QgZFWMe3sJxESjJg4Tpq-AAZxpoIH4VEX1IGdManU98d-Ra4tlFPAzR9MLwQXvlqMX5ln1kvQmMgch6YkMO-lNzbR72ccyX5emXKarx7O0A5rENa6JHKIL79MzOq0IwDleD2LuvMli62yZBNAwvYSf0mJW7ubAG42QYGXaXNngMdyJgRt6NYGxRtPHBaP8Q3-cZcbblhUh8NO07DGGCPe3jfJyomkP_bThsZsM8piO629JTVETlraBYh1RRrRLWuINkUuKeGbs2Y439Yxra8oWtNoxOVXEZTBcy3PIcGWz0jsT77P7T8JoTWLtODJ3YPyeYbPYZwNhBUnEghJ7dvU8LMtR5nSbrlj6thFnAHcNQlB7HxecByVmrSfdHMGzSA2s_5J-A7SfIRuOgZGdKTDn4sbsJRHPvfdQK7c1HJI_6zDB9_0000?></g></svg> |