-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathHardstack.Diagram.drawio
More file actions
1024 lines (1024 loc) · 112 KB
/
Hardstack.Diagram.drawio
File metadata and controls
1024 lines (1024 loc) · 112 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/136.0.0.0 Safari/537.36" version="27.0.1">
<diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
<mxGraphModel dx="6037" dy="3979" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
<root>
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
<mxCell id="2GiTNw1I56buVSM36ilE-0" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>BlockFactory</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ BlockFactory(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ newBlock(SpawnData): Entity</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="419" y="5189" width="236" height="111" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-1" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CheckpointComponent</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ CheckpointComponent(Point2D): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- texture: AnimatedTexture<br/>- flagEntity: Entity<br/>- animStart: AnimationChannel<br/>- pos: Point2D<br/>- animMove: AnimationChannel</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ plantFlag(): void<br/>+ teleportToCheckpoint(Entity): void<br/>+ getPosition(): Point2D<br/>+ getFlagEntity(): Entity</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1564" y="2199" width="266" height="323" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-2" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ConnectionPool</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- ConnectionPool(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- datasource: HikariDataSource</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ getConnection(): Connection</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="-142" y="1893" width="238" height="145" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-3" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Constants</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Constants(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ROPE_LENGTH: float<br/>+ JUMP_FORCE: int<br/>+ RUNNING_SPEED: int<br/>+ PLAYER_ROPE_DISTANCE: int<br/>+ SWING_FORCE: int<br/>+ HOLD_FORCE: int</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="2118" y="4781" width="239" height="238" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-4" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CreditsController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ CreditsController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- btnExit: ImageView</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ initialize(): void<br/>- setupHoverEffect(ImageView): void<br/>- handleExitClick(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1759" y="4806" width="276" height="188" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-5" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>CustomLoadingSample</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ CustomLoadingSample(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"># initGame(): void<br/># initSettings(GameSettings): void<br/># initInput(): void<br/># initUI(): void<br/>+ main(String[]): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="851" y="4515" width="253" height="211" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-6" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>DatabaseCredentials</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ DatabaseCredentials(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ URL: String<br/>+ USERNAME: String<br/>+ PASSWORD: String</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="2489" y="1342" width="217" height="157" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-7" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>DatabaseInit</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ DatabaseInit(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- createDatabase: String<br/>- createGameProgress: String<br/>- createSettingPreference: String<br/>- createSaveProgress: String</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ initialize(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="693" y="4793" width="249" height="215" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-8" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>EntityType</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ EntityType(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PLAYER1: <br/>+ PLATFORM: <br/>+ FLAG: <br/>+ PLAYER2: <br/>+ SPAWN_POINT: <br/>+ ONE_WAY_PLATFORM: <br/>+ CHECK_POINT: <br/>+ ROPE_SEGMENT: </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): EntityType[]<br/>+ valueOf(String): EntityType</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="167" y="5625" width="220" height="350" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-9" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>FileChooserUtils</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ FileChooserUtils(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- fileChooser: FileChooser</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ chooseFile(Window): String?<br/>+ saveFile(Window): String?</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="942" y="1880" width="230" height="161" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-10" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GameMenuSettingsController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ GameMenuSettingsController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- lblMusicVolume: Label<br/>- viewModel: SettingPreferenceViewModel<br/>- slMusicVolume: Slider<br/>- cbInfiJump: CheckBox<br/>- slFXVolume: Slider<br/>- cbInfiGrip: CheckBox<br/>- lblFxVolume: Label<br/>- dao: SettingPreferenceDao<br/>- parentContainer: AnchorPane<br/>- cbInfiClimb: CheckBox<br/>- snapshot: SettingPreference<br/>- btnExit: ImageView</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- handleExitClick(): void<br/>- initialize(): void<br/>+ update(SettingPreference): void<br/>- setupHoverEffect(ImageView): void<br/>+ setParentContainer(AnchorPane): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="702" y="3211" width="310" height="539" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-11" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GameProgress</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ GameProgress(int, int): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- saveProgressId: int<br/>- gameProgressId: int<br/>- deepFallCount: int<br/>- xCoordinate: float<br/>- yCoordinate: float<br/>- heightProgress: int</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ setXCoordinate(float): void<br/>+ setHeightProgress(int): void<br/>+ setGameProgressId(int): void<br/>+ getYCoordinate(): float<br/>+ setDeepFallCount(int): void<br/>+ getDeepFallCount(): int<br/>+ getGameProgressId(): int<br/>+ setYCoordinate(float): void<br/>+ readOnlyCopy(int, int): GameProgress<br/>+ setSaveProgressId(int): void<br/>+ getXCoordinate(): float<br/>+ getHeightProgress(): int<br/>+ getSaveProgressId(): int</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1452" y="-16" width="290" height="593" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-12" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GameProgressDao</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ GameProgressDao(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ updateGameProgress(GameProgress): void<br/>+ deleteGameProgress(int): void<br/>+ updateDeepFallCount(GameProgress): void<br/>+ selectGameProgress(int): GameProgress<br/>+ selectHeightGameProgress(int): int<br/>+ insertGameProgress(GameProgress): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1435" y="1301" width="325" height="238" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-13" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>GameProgressEvent</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ GameProgressEvent(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ UPDATE_Y_COORDINATE: <br/>+ UPDATE_HEIGHT: <br/>+ UPDATE_DEEP_FALL_COUNT: <br/>+ UPDATE_X_COORDINATE: </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): GameProgressEvent[]<br/>+ valueOf(String): GameProgressEvent</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="936" y="6499" width="282" height="242" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-14" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>GameProgressViewModel</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- GameProgressViewModel(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- dao: GameProgressDao<br/>- instance: GameProgressViewModel</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ getInstance(): GameProgressViewModel<br/>+ saveGameProgress(): void<br/>+ onEvent(GameProgressEvent, Object): void<br/>+ getSnapshot(): GameProgress</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1475" y="1839" width="325" height="242" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-15" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>HeightProgressUi</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ HeightProgressUi(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- heightText: Text</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ update(GameProgress): void<br/>+ getView(): Node</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="-118" y="5360" width="230" height="161" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-16" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>JoeGameMenu</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ JoeGameMenu(): </p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="311" y="5404" width="172" height="78" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-17" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>JoeGameMenuController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ JoeGameMenuController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- btnPlay: ImageView<br/>- btnExit: ImageView<br/>- btnSettings: ImageView<br/>- apGameMenuContainer: AnchorPane</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- handleExitClick(): void<br/>- handlePlayClick(): void<br/>+ initialize(): void<br/>- setupHoverEffect(ImageView): void<br/>- handleSettingsClick(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="775" y="5639" width="285" height="323" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-18" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>JoeIntroScene</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ JoeIntroScene(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- animations: List&lt;Animation&lt;?&gt;&gt;</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ startIntro(): void<br/># onUpdate(double): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="709" y="5360" width="257" height="161" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-19" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>JoeMainMenu</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ JoeMainMenu(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- viewModel: SettingPreferenceViewModel<br/>- dao: SettingPreferenceDao<br/>- mainMenuMusic: Music</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ getMainMenuMusic(): Music</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="262" y="2266" width="310" height="188" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-20" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>JoeMainMenuController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ JoeMainMenuController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- menu_exit: ImageView<br/>+ bgTitle: ImageView<br/>- menu_settings: ImageView<br/>- menu_credits: ImageView<br/>- bgImage: ImageView<br/>- menu_play: ImageView<br/>- apContainer: AnchorPane</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- setupHoverEffect(ImageView): void<br/>+ initialize(): void<br/>- handlePlayClick(): void<br/>- handleQuitClick(): void<br/>- handleCreditsClick(): void<br/>- handleSettingsClick(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="-21" y="6405" width="276" height="431" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-21" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>MainApplication</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ MainApplication(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- nameTag1: Text<br/>- isPulling: boolean<br/>- hasPlayerOnePassedOneWayPlatform: boolean<br/>- nameTag2: Text<br/>- sfx_hover: Sound<br/>- sfx_cry: Sound<br/>- isSwinging: boolean<br/>- gameProgressViewModel: GameProgressViewModel<br/>- hasPlayerTwoPassedOneWayPlatform: boolean<br/>- isCrouching: boolean<br/>- sfx_splat: Sound<br/>- sfx_meow: Sound<br/>- revoluteJoint: RevoluteJoint<br/>- settingPreferenceViewModel: SettingPreferenceViewModel<br/>- sfx_click: Sound<br/>- originY: double<br/>- ropeJoint: RopeJoint<br/>- distanceJoint: DistanceJoint<br/>- music_underground: Music</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"># initUI(): void<br/># initSettings(GameSettings): void<br/>- getControlP2(): Player2Component<br/>+ getSfx_click(): Sound<br/>+ main(String[]): void<br/>- addRopeJoint(Entity, Entity, float): void<br/>+ setSfx_meow(Sound): void<br/>- getControlP1(): Player1Component<br/>+ getSfx_meow(): Sound<br/>+ deleteRevoluteJoint(): void<br/>+ deleteDistanceJoint(): void<br/># initInput(): void<br/>- createRopeVisualization(): void<br/>+ createDistanceJoint(): void<br/>+ getPlayer1(): Entity<br/>+ getSfx_splat(): Sound<br/># initPhysics(): void<br/>+ getPlayer2(): Entity<br/>+ setSfx_hover(Sound): void<br/># onUpdate(double): void<br/>+ createRevoluteJoint(): void<br/># initGame(): void<br/>+ getSfx_hover(): Sound<br/>+ setSfx_click(Sound): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="424" y="6000" width="427" height="1241" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-22" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;interface&gt;&gt;</i><br/><b>Observer<T></b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ update(T): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1057" y="244" width="161" height="90" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-23" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PlatformerFactory</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PlatformerFactory(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ checkpoint(SpawnData): Entity<br/>+ newOneWayPlatform(SpawnData): Entity<br/>+ spawn(SpawnData): Entity<br/>+ newPlatform(SpawnData): Entity</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1002" y="5148" width="311" height="184" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-24" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Player1Component</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Player1Component(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">~ player2: Entity<br/>+ flag: CheckpointComponent</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ onUpdate(double): void<br/>+ plant(): void<br/>+ onAdded(): void<br/>+ swingMovement(EntityState, int): void<br/>~ isHanging(): boolean<br/>+ loadPlayer2(Entity): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1411" y="4752" width="292" height="296" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-25" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>Player2Component</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ Player2Component(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">~ player1: Entity</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ onUpdate(double): void<br/>+ loadPlayer1(Entity): void<br/>~ isHanging(): boolean<br/>+ swingMovement(EntityState, int): void<br/>+ onAdded(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1051" y="4779" width="292" height="242" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-26" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PlayerComponent</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PlayerComponent(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"># animSplat: AnimationChannel<br/>~ CHECKPOINT: EntityState<br/># otherPhysics: PhysicsComponent<br/>~ SWING: EntityState<br/>- wallClingTimer: TimerAction<br/>~ JUMP: EntityState<br/>~ STAND: EntityState<br/>~ HANG: EntityState<br/># animCrouch: AnimationChannel<br/>- isTiredTouchingWall: boolean<br/># animHold: AnimationChannel<br/># animSwing: AnimationChannel<br/># physics: PhysicsComponent<br/>~ SAVE: EntityState<br/>~ PULLED: EntityState<br/>~ HOLD: EntityState<br/>~ SPLAT: EntityState<br/>~ FALL: EntityState<br/>~ CROUCH: EntityState<br/># state: StateComponent<br/># otherView: ViewComponent<br/># animPull: AnimationChannel<br/>- settingViewModel: SettingPreferenceViewModel<br/># animMove: AnimationChannel<br/># isInfiniteJump: boolean<br/># animHang: AnimationChannel<br/># stateData: Map&lt;EntityState, StateData&gt;<br/># animPlant: AnimationChannel<br/># isOnGroundFlag: boolean<br/>~ PULL: EntityState<br/># isInfiniteGrip: boolean<br/># animPulled: AnimationChannel<br/># view: ViewComponent<br/># isClimbWalls: boolean<br/>~ WALK: EntityState<br/># texture: AnimatedTexture<br/># animJump: AnimationChannel<br/># animFall: AnimationChannel<br/># otherState: StateComponent<br/>+ isTouchingWall: boolean<br/>- gameViewModel: GameProgressViewModel<br/># animCry: AnimationChannel<br/># animIdle: AnimationChannel</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">~ linearMovement(EntityState, int): void<br/>~ tryMovingState(int): void<br/>+ cry(): void<br/>~ swingMovement(EntityState, int): void<br/>+ playerOnGround(): boolean<br/>+ jump(): void<br/>+ crouch(): void<br/># setFriction(float): void<br/>+ getSWING(): EntityState<br/>+ hold(): void<br/>+ isComponentInjectionRequired(): boolean<br/>+ isHoldingWall(): boolean<br/>+ update(SettingPreference): void<br/>+ stand(): void<br/>+ moveLeft(): void<br/>+ moveRight(): void<br/># setBodyStatic(boolean): void<br/>+ stop(): void<br/>+ pull(): boolean<br/>+ pulled(): void<br/>~ applyDamping(PhysicsComponent, float): void<br/>+ onAdded(): void<br/>+ getState(): StateComponent</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1159" y="2549" width="356" height="1862" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-27" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>PlayerFactory</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ PlayerFactory(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ newPlayer1(SpawnData): Entity<br/>+ newPlayer2(SpawnData): Entity</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1612" y="5175" width="250" height="140" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-28" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ProgressFilesController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ProgressFilesController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- ivContainerBackground3: ImageView<br/>- btnExit: ImageView<br/>- apFile3: AnchorPane<br/>- gameDao: GameProgressDao<br/>- apFile1: AnchorPane<br/>- apFile2: AnchorPane<br/>- ivContainerBackground2: ImageView<br/>- saveDao: SaveProgressDao<br/>- ivContainerBackground1: ImageView<br/>- viewModel: GameProgressViewModel</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- handleFileClick(MouseEvent): void<br/>- setSavedFiles(): void<br/>- setHasNoSaveUi(int): void<br/>- handleDeleteClick(MouseEvent): void<br/>+ initialize(): void<br/>- setNewGame(int): void<br/>- resetFileSlotUi(): void<br/>- chooseFile(int, MouseEvent): void<br/>- handleNewFileClick(MouseEvent): void<br/>- handleExportClick(MouseEvent): void<br/>- deleteSaveFile(int): void<br/>- saveFile(int, MouseEvent): void<br/>- handleExitClick(): void<br/>- setPlay(int): void<br/>- handleImportClick(MouseEvent): void<br/>- setHasSaveUi(int): void<br/>- setupHoverEffect(ImageView): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="2129" y="3076" width="296" height="809" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-29" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SaveProgressDao</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SaveProgressDao(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ insertSaveProgress(int): void<br/>+ deleteSaveProgress(int): void<br/>+ selectSaveProgress(int): boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1848" y="1882" width="259" height="157" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-30" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SaveRunnable</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SaveRunnable(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- viewModel: GameProgressViewModel</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ run(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1433" y="5373" width="289" height="145" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-31" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SavingGameSpinnerUi</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SavingGameSpinnerUi(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- spinnerView: HBox</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ getView(): HBox</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="23" y="5173" width="229" height="145" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-32" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ScreenManager</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ScreenManager(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- mainContainer: AnchorPane</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ getMainContainer(): AnchorPane<br/>+ switchScreen(String): void<br/>+ setMainContainer(AnchorPane): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="-24" y="4806" width="283" height="188" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-33" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SerializationUtils</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SerializationUtils(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ serialize(String, GameProgress): void<br/>+ deserialize(String): GameProgress</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="2155" y="1895" width="284" height="140" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-34" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SettingPreference</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SettingPreference(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- musicVolume: float<br/>- fxVolume: float<br/>- settingPreferenceId: int<br/>- isInfiniteGrip: boolean<br/>- isInfiniteJump: boolean<br/>- isClimbWalls: boolean</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ isInfiniteGrip(): boolean<br/>+ getMusicVolume(): float<br/>+ setInfiniteGrip(boolean): void<br/>+ setInfiniteJump(boolean): void<br/>+ readOnlyCopy(): SettingPreference<br/>+ isClimbWalls(): boolean<br/>+ getFxVolume(): float<br/>+ setFxVolume(float): void<br/>+ setMusicVolume(float): void<br/>+ getSettingPreferenceId(): int<br/>+ setClimbWalls(boolean): void<br/>+ isInfiniteJump(): boolean</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="2" y="597" width="271" height="566" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-35" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SettingPreferenceDao</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SettingPreferenceDao(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ insertSettingPreference(SettingPreference): void<br/>+ updateSettingPreference(SettingPreference): void<br/>+ selectSettingPreference(): SettingPreference<br/>+ deleteSettingPreference(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="213" y="1328" width="368" height="184" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-36" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;enumeration&gt;&gt;</i><br/><b>SettingPreferenceEvent</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SettingPreferenceEvent(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ UPDATE_MUSIC_VOLUME: <br/>+ UPDATE_CLIMB_WALLS: <br/>+ UPDATE_INFINITE_GRIP: <br/>+ UPDATE_FX_VOLUME: <br/>+ UPDATE_INFINITE_JUMP: </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ values(): SettingPreferenceEvent[]<br/>+ valueOf(String): SettingPreferenceEvent</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1105" y="5666" width="304" height="269" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-37" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SettingPreferenceUi</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SettingPreferenceUi(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ update(SettingPreference): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="811" y="1369" width="252" height="111" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-38" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SettingPreferenceViewModel</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- SettingPreferenceViewModel(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- instance: SettingPreferenceViewModel<br/>- dao: SettingPreferenceDao</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ getInstance(): SettingPreferenceViewModel<br/>+ saveSettingPreference(): void<br/>+ getSnapshot(): SettingPreference<br/>+ onEvent(SettingPreferenceEvent, Object): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="464" y="1839" width="347" height="242" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-39" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>SettingsController</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ SettingsController(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- lblFxVolume: Label<br/>- slMusicVolume: Slider<br/>- viewModel: SettingPreferenceViewModel<br/>- dao: SettingPreferenceDao<br/>- slFXVolume: Slider<br/>- btnExit: ImageView<br/>- cbInfiGrip: CheckBox<br/>- cbInfiClimb: CheckBox<br/>- snapshot: SettingPreference<br/>- cbInfiJump: CheckBox<br/>- lblMusicVolume: Label</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- initialize(): void<br/>+ update(SettingPreference): void<br/>- setupHoverEffect(ImageView): void<br/>- handleExitClick(): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="-18" y="3238" width="310" height="485" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-40" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>StateData</b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ StateData(AnimationChannel, int): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;"># channel: AnimationChannel<br/># moveSpeed: int</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1123" y="1675" width="268" height="140" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-41" value="<p style="margin:0px;margin-top:4px;text-align:center;"><i>&lt;&lt;interface&gt;&gt;</i><br/><b>Subject<T></b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ removeObserver(Observer&lt;T&gt;): void<br/>+ notifyObservers(): void<br/>+ addObserver(Observer&lt;T&gt;): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1195" y="817" width="285" height="158" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-42" value="<p style="margin:0px;margin-top:4px;text-align:center;"><b>ViewModel<T></b></p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ ViewModel(): </p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">- observers: List&lt;Observer&lt;T&gt;&gt;<br/># state: T</p><hr size="1"/><p style="margin:0 0 0 4px;line-height:1.6;">+ notifyObservers(): void<br/>+ hasCurrentState(): boolean<br/>+ addObserver(Observer&lt;T&gt;): void<br/>+ removeObserver(Observer&lt;T&gt;): void<br/>+ clearState(): void<br/>+ setState(T): void</p>" style="verticalAlign=top;align=left;overflow=fill;fontSize=14;fontFamily=Helvetica;html=1;rounded=0;shadow=0;comic=0;labelBackgroundColor=none;strokeWidth=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
<mxGeometry x="1115" y="1272" width="285" height="296" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-43" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.833;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.001;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-10" target="2GiTNw1I56buVSM36ilE-22">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="960" y="3180" />
<mxPoint x="917" y="3180" />
<mxPoint x="917" y="1640" />
<mxPoint x="1097" y="1640" />
<mxPoint x="1097" y="340" />
<mxPoint x="1097" y="340" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-44" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.167;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-10" target="2GiTNw1I56buVSM36ilE-34">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="754" y="3180" />
<mxPoint x="757" y="3180" />
<mxPoint x="757" y="2100" />
<mxPoint x="877" y="2100" />
<mxPoint x="877" y="1500" />
<mxPoint x="777" y="1500" />
<mxPoint x="777" y="1280" />
<mxPoint x="77" y="1280" />
<mxPoint x="77" y="1200" />
<mxPoint x="69" y="1200" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-45" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-44">
<mxGeometry x="746" y="2900" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-46" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-44">
<mxGeometry x="66" y="1210" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-47" value="snapshot" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-44">
<mxGeometry x="77" y="1210" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-48" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-10" target="2GiTNw1I56buVSM36ilE-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="857" y="3180" />
<mxPoint x="837" y="3180" />
<mxPoint x="837" y="1640" />
<mxPoint x="637" y="1640" />
<mxPoint x="637" y="1300" />
<mxPoint x="397" y="1300" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-49" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-48">
<mxGeometry x="712" y="1620" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-50" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.167;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-10" target="2GiTNw1I56buVSM36ilE-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="754" y="3180" />
<mxPoint x="757" y="3180" />
<mxPoint x="757" y="2100" />
<mxPoint x="317" y="2100" />
<mxPoint x="317" y="1780" />
<mxPoint x="357" y="1780" />
<mxPoint x="357" y="1540" />
<mxPoint x="397" y="1540" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-51" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-50">
<mxGeometry x="746" y="3170" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-52" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-50">
<mxGeometry x="306" y="1850" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-53" value="dao" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-50">
<mxGeometry x="317" y="1850" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-54" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.167;exitY=0.000;exitDx=0;exitDy=0;entryX=0.167;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-10" target="2GiTNw1I56buVSM36ilE-38">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="754" y="3180" />
<mxPoint x="757" y="3180" />
<mxPoint x="757" y="2140" />
<mxPoint x="437" y="2140" />
<mxPoint x="437" y="1800" />
<mxPoint x="521" y="1800" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-55" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-54">
<mxGeometry x="706" y="3170" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-56" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-54">
<mxGeometry x="592" y="2120" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-57" value="viewModel" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-54">
<mxGeometry x="567" y="2140" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-58" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-12" target="2GiTNw1I56buVSM36ilE-11">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points" />
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-59" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-58">
<mxGeometry x="1547" y="953" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-60" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-14" target="2GiTNw1I56buVSM36ilE-12">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1637" y="1640" />
<mxPoint x="1597" y="1640" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-61" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-60">
<mxGeometry x="1626" y="1754" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-62" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-60">
<mxGeometry x="1612" y="1620" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-63" value="dao" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-60">
<mxGeometry x="1597" y="1554" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-64" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.833;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-14" target="2GiTNw1I56buVSM36ilE-12">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1745" y="1800" />
<mxPoint x="1777" y="1800" />
<mxPoint x="1777" y="1280" />
<mxPoint x="1597" y="1280" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-65" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-64">
<mxGeometry x="1727" y="1703" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-66" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#000082;exitX=0.167;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-14" target="2GiTNw1I56buVSM36ilE-42">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1529" y="1660" />
<mxPoint x="1257" y="1660" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-67" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.001;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-15" target="2GiTNw1I56buVSM36ilE-22">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="-3" y="5320" />
<mxPoint x="-43" y="5320" />
<mxPoint x="-43" y="3180" />
<mxPoint x="157" y="3180" />
<mxPoint x="157" y="1260" />
<mxPoint x="1097" y="1260" />
<mxPoint x="1097" y="340" />
<mxPoint x="1097" y="340" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-68" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.750;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-19" target="2GiTNw1I56buVSM36ilE-34">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="340" y="2240" />
<mxPoint x="337" y="2240" />
<mxPoint x="337" y="2120" />
<mxPoint x="197" y="2120" />
<mxPoint x="197" y="1200" />
<mxPoint x="205" y="1200" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-69" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-68">
<mxGeometry x="242" y="2100" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-70" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-19" target="2GiTNw1I56buVSM36ilE-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="495" y="2240" />
<mxPoint x="437" y="2240" />
<mxPoint x="437" y="2200" />
<mxPoint x="277" y="2200" />
<mxPoint x="277" y="1780" />
<mxPoint x="357" y="1780" />
<mxPoint x="357" y="1540" />
<mxPoint x="397" y="1540" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-71" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-70">
<mxGeometry x="392" y="2180" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-72" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-70">
<mxGeometry x="346" y="1517" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-73" value="dao" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-70">
<mxGeometry x="365" y="1580" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-74" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-19" target="2GiTNw1I56buVSM36ilE-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="340" y="2240" />
<mxPoint x="337" y="2240" />
<mxPoint x="337" y="2120" />
<mxPoint x="397" y="2120" />
<mxPoint x="397" y="1640" />
<mxPoint x="637" y="1640" />
<mxPoint x="637" y="1300" />
<mxPoint x="397" y="1300" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-75" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-74">
<mxGeometry x="347" y="1870" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-76" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.167;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-19" target="2GiTNw1I56buVSM36ilE-38">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="495" y="2240" />
<mxPoint x="437" y="2240" />
<mxPoint x="437" y="1800" />
<mxPoint x="521" y="1800" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-77" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-76">
<mxGeometry x="426" y="2230" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-78" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-76">
<mxGeometry x="426" y="1937" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-79" value="viewModel" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-76">
<mxGeometry x="495" y="2230" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-80" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-0">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="530" y="5960" />
<mxPoint x="537" y="5960" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-81" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-80">
<mxGeometry x="487" y="5348" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-82" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-14">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="744" y="5960" />
<mxPoint x="737" y="5960" />
<mxPoint x="737" y="5580" />
<mxPoint x="2097" y="5580" />
<mxPoint x="2097" y="2140" />
<mxPoint x="1917" y="2140" />
<mxPoint x="1917" y="2060" />
<mxPoint x="1817" y="2060" />
<mxPoint x="1817" y="1620" />
<mxPoint x="1637" y="1620" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-83" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-82">
<mxGeometry x="733" y="5975" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-84" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-82">
<mxGeometry x="2002" y="2120" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-85" value="gameProgressViewModel" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-82">
<mxGeometry x="1917" y="2090" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-86" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-15">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="530" y="5960" />
<mxPoint x="537" y="5960" />
<mxPoint x="537" y="5560" />
<mxPoint x="-3" y="5560" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-87" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-86">
<mxGeometry x="-53" y="5530" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-88" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.001;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-16">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="530" y="5960" />
<mxPoint x="537" y="5960" />
<mxPoint x="537" y="5560" />
<mxPoint x="397" y="5560" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-89" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-88">
<mxGeometry x="347" y="5529" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-90" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-18">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="530" y="5960" />
<mxPoint x="537" y="5960" />
<mxPoint x="537" y="5560" />
<mxPoint x="837" y="5560" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-91" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-90">
<mxGeometry x="487" y="5683" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-92" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-19">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="530" y="5960" />
<mxPoint x="537" y="5960" />
<mxPoint x="537" y="5560" />
<mxPoint x="277" y="5560" />
<mxPoint x="277" y="4880" />
<mxPoint x="597" y="4880" />
<mxPoint x="597" y="2220" />
<mxPoint x="340" y="2220" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-93" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-92">
<mxGeometry x="227" y="5380" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-94" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-23">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="530" y="5960" />
<mxPoint x="537" y="5960" />
<mxPoint x="537" y="5560" />
<mxPoint x="1157" y="5560" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-95" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-94">
<mxGeometry x="487" y="5617" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-96" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-27">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="530" y="5960" />
<mxPoint x="537" y="5960" />
<mxPoint x="537" y="5560" />
<mxPoint x="1877" y="5560" />
<mxPoint x="1877" y="5140" />
<mxPoint x="1737" y="5140" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-97" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-96">
<mxGeometry x="1182" y="5540" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-98" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-30">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="530" y="5960" />
<mxPoint x="537" y="5960" />
<mxPoint x="537" y="5560" />
<mxPoint x="1577" y="5560" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-99" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-98">
<mxGeometry x="859" y="5540" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-100" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-31">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="530" y="5960" />
<mxPoint x="537" y="5960" />
<mxPoint x="537" y="5560" />
<mxPoint x="137" y="5560" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-101" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-100">
<mxGeometry x="487" y="5750" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-102" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.167;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-21" target="2GiTNw1I56buVSM36ilE-38">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="744" y="5960" />
<mxPoint x="737" y="5960" />
<mxPoint x="737" y="5580" />
<mxPoint x="677" y="5580" />
<mxPoint x="677" y="2180" />
<mxPoint x="437" y="2180" />
<mxPoint x="437" y="1800" />
<mxPoint x="521" y="1800" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-103" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-102">
<mxGeometry x="733" y="5950" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-104" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-102">
<mxGeometry x="552" y="2160" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-105" value="settingPreferenceViewModel" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-102">
<mxGeometry x="677" y="2170" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-106" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.167;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-24" target="2GiTNw1I56buVSM36ilE-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1460" y="4720" />
<mxPoint x="1457" y="4720" />
<mxPoint x="1457" y="4440" />
<mxPoint x="1631" y="4440" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-107" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-106">
<mxGeometry x="1407" y="4617" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-108" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.833;exitY=0.000;exitDx=0;exitDy=0;entryX=0.750;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-24" target="2GiTNw1I56buVSM36ilE-1">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1654" y="2560" />
<mxPoint x="1764" y="2560" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-109" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-108">
<mxGeometry x="1643" y="4727" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-110" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-108">
<mxGeometry x="1703" y="2540" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-111" value="flag" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-108">
<mxGeometry x="1764" y="2531" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-112" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#000082;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-24" target="2GiTNw1I56buVSM36ilE-26">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1557" y="4680" />
<mxPoint x="1337" y="4680" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-113" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.167;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-24" target="2GiTNw1I56buVSM36ilE-40">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1460" y="4720" />
<mxPoint x="1457" y="4720" />
<mxPoint x="1457" y="4440" />
<mxPoint x="1137" y="4440" />
<mxPoint x="1137" y="2060" />
<mxPoint x="1190" y="2060" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-114" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-113">
<mxGeometry x="1272" y="4420" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-115" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#000082;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-25" target="2GiTNw1I56buVSM36ilE-26">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1270" y="4680" />
<mxPoint x="1337" y="4680" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-116" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-25" target="2GiTNw1I56buVSM36ilE-40">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1124" y="4500" />
<mxPoint x="1097" y="4500" />
<mxPoint x="1097" y="2520" />
<mxPoint x="1137" y="2520" />
<mxPoint x="1137" y="2060" />
<mxPoint x="1190" y="2060" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-117" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-116">
<mxGeometry x="1047" y="2510" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-118" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-26" target="2GiTNw1I56buVSM36ilE-14">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1248" y="2520" />
<mxPoint x="1317" y="2520" />
<mxPoint x="1317" y="2180" />
<mxPoint x="1917" y="2180" />
<mxPoint x="1917" y="2060" />
<mxPoint x="1817" y="2060" />
<mxPoint x="1817" y="1620" />
<mxPoint x="1637" y="1620" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-119" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-118">
<mxGeometry x="1277" y="2500" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-120" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-118">
<mxGeometry x="1612" y="2160" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-121" value="gameViewModel" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-118">
<mxGeometry x="1317" y="2255" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-122" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.001;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-26" target="2GiTNw1I56buVSM36ilE-22">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1426" y="2520" />
<mxPoint x="1417" y="2520" />
<mxPoint x="1417" y="1260" />
<mxPoint x="1097" y="1260" />
<mxPoint x="1097" y="340" />
<mxPoint x="1097" y="340" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-123" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.167;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-26" target="2GiTNw1I56buVSM36ilE-38">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1248" y="2520" />
<mxPoint x="1317" y="2520" />
<mxPoint x="1317" y="2120" />
<mxPoint x="437" y="2120" />
<mxPoint x="437" y="1800" />
<mxPoint x="521" y="1800" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-124" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-123">
<mxGeometry x="1260" y="2500" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-125" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-123">
<mxGeometry x="652" y="2100" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-126" value="settingViewModel" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-123">
<mxGeometry x="437" y="2110" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-127" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.750;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-26" target="2GiTNw1I56buVSM36ilE-40">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1248" y="2520" />
<mxPoint x="1317" y="2520" />
<mxPoint x="1317" y="1840" />
<mxPoint x="1324" y="1840" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-128" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-127">
<mxGeometry x="1289" y="2500" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-129" value="*" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-127">
<mxGeometry x="1315" y="1813" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-130" value="stateData" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-127">
<mxGeometry x="1324" y="1813" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-131" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.167;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-27" target="2GiTNw1I56buVSM36ilE-24">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1737" y="4700" />
<mxPoint x="1460" y="4700" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-132" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-131">
<mxGeometry x="1573" y="4680" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-133" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-27" target="2GiTNw1I56buVSM36ilE-25">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1737" y="5120" />
<mxPoint x="1377" y="5120" />
<mxPoint x="1377" y="4740" />
<mxPoint x="1124" y="4740" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-134" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-133">
<mxGeometry x="1327" y="5047" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-135" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-28" target="2GiTNw1I56buVSM36ilE-11">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="2351" y="3020" />
<mxPoint x="2177" y="3020" />
<mxPoint x="2177" y="2060" />
<mxPoint x="2457" y="2060" />
<mxPoint x="2457" y="1260" />
<mxPoint x="1597" y="1260" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-136" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-135">
<mxGeometry x="2292" y="2040" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-137" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-28" target="2GiTNw1I56buVSM36ilE-12">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="2351" y="3020" />
<mxPoint x="2177" y="3020" />
<mxPoint x="2177" y="2060" />
<mxPoint x="2137" y="2060" />
<mxPoint x="2137" y="1800" />
<mxPoint x="1777" y="1800" />
<mxPoint x="1777" y="1280" />
<mxPoint x="1597" y="1280" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-138" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-137">
<mxGeometry x="2087" y="1855" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-139" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-28" target="2GiTNw1I56buVSM36ilE-12">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="2203" y="3040" />
<mxPoint x="2137" y="3040" />
<mxPoint x="2137" y="2160" />
<mxPoint x="1457" y="2160" />
<mxPoint x="1457" y="1640" />
<mxPoint x="1597" y="1640" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-140" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-139">
<mxGeometry x="2148" y="3020" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-141" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-139">
<mxGeometry x="1487" y="1620" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-142" value="gameDao" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-139">
<mxGeometry x="1457" y="1760" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-143" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-28" target="2GiTNw1I56buVSM36ilE-14">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="2203" y="3040" />
<mxPoint x="2137" y="3040" />
<mxPoint x="2137" y="2080" />
<mxPoint x="1917" y="2080" />
<mxPoint x="1917" y="2060" />
<mxPoint x="1817" y="2060" />
<mxPoint x="1817" y="1620" />
<mxPoint x="1637" y="1620" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-144" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-143">
<mxGeometry x="2192" y="3030" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-145" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-143">
<mxGeometry x="1967" y="2060" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-146" value="viewModel" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-143">
<mxGeometry x="1817" y="1830" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-147" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-28" target="2GiTNw1I56buVSM36ilE-29">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="2203" y="3040" />
<mxPoint x="2137" y="3040" />
<mxPoint x="2137" y="2160" />
<mxPoint x="1912" y="2160" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-148" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-147">
<mxGeometry x="2126" y="3030" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-149" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-147">
<mxGeometry x="1901" y="2069" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-150" value="saveDao" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-147">
<mxGeometry x="1912" y="2150" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-151" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.750;exitY=0.000;exitDx=0;exitDy=0;entryX=0.750;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-28" target="2GiTNw1I56buVSM36ilE-29">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="2351" y="3020" />
<mxPoint x="2177" y="3020" />
<mxPoint x="2177" y="2060" />
<mxPoint x="2042" y="2060" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-152" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-151">
<mxGeometry x="2127" y="2530" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-153" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-30" target="2GiTNw1I56buVSM36ilE-14">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1577" y="5100" />
<mxPoint x="2057" y="5100" />
<mxPoint x="2057" y="2140" />
<mxPoint x="1917" y="2140" />
<mxPoint x="1917" y="2060" />
<mxPoint x="1817" y="2060" />
<mxPoint x="1817" y="1620" />
<mxPoint x="1637" y="1620" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-154" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-153">
<mxGeometry x="1566" y="5295" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-155" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-153">
<mxGeometry x="1947" y="2120" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-156" value="viewModel" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-153">
<mxGeometry x="1817" y="1720" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-157" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.750;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-35" target="2GiTNw1I56buVSM36ilE-34">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="397" y="1220" />
<mxPoint x="197" y="1220" />
<mxPoint x="197" y="1200" />
<mxPoint x="205" y="1200" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-158" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-157">
<mxGeometry x="147" y="1200" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-159" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.001;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-37" target="2GiTNw1I56buVSM36ilE-22">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="937" y="1260" />
<mxPoint x="1097" y="1260" />
<mxPoint x="1097" y="340" />
<mxPoint x="1097" y="340" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-160" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-38" target="2GiTNw1I56buVSM36ilE-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="637" y="1300" />
<mxPoint x="397" y="1300" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-161" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-160">
<mxGeometry x="587" y="1344" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-162" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.167;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-38" target="2GiTNw1I56buVSM36ilE-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="521" y="1780" />
<mxPoint x="357" y="1780" />
<mxPoint x="357" y="1540" />
<mxPoint x="397" y="1540" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-163" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-162">
<mxGeometry x="488" y="1760" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-164" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-162">
<mxGeometry x="434" y="1760" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-165" value="dao" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-162">
<mxGeometry x="357" y="1610" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-166" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=none;endArrow=block;endSize=12;strokeColor=#000082;exitX=0.833;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-38" target="2GiTNw1I56buVSM36ilE-42">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="753" y="1660" />
<mxPoint x="1257" y="1660" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-167" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=block;endSize=12;strokeColor=#008200;exitX=0.167;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.001;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-39" target="2GiTNw1I56buVSM36ilE-22">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="34" y="3200" />
<mxPoint x="117" y="3200" />
<mxPoint x="117" y="1260" />
<mxPoint x="1097" y="1260" />
<mxPoint x="1097" y="340" />
<mxPoint x="1097" y="340" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-168" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.250;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-39" target="2GiTNw1I56buVSM36ilE-34">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="137" y="3200" />
<mxPoint x="197" y="3200" />
<mxPoint x="197" y="2040" />
<mxPoint x="-163" y="2040" />
<mxPoint x="-163" y="1280" />
<mxPoint x="77" y="1280" />
<mxPoint x="77" y="1200" />
<mxPoint x="69" y="1200" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-169" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-168">
<mxGeometry x="126" y="3213" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-170" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-168">
<mxGeometry x="12" y="1260" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-171" value="snapshot" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-168">
<mxGeometry x="77" y="1230" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-172" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-39" target="2GiTNw1I56buVSM36ilE-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="137" y="3200" />
<mxPoint x="197" y="3200" />
<mxPoint x="197" y="2040" />
<mxPoint x="237" y="2040" />
<mxPoint x="237" y="1780" />
<mxPoint x="357" y="1780" />
<mxPoint x="357" y="1540" />
<mxPoint x="397" y="1540" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-173" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-172">
<mxGeometry x="177" y="3140" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-174" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-172">
<mxGeometry x="372" y="1520" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-175" value="dao" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-172">
<mxGeometry x="237" y="1835" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-176" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=1;startArrow=none;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.833;exitY=0.000;exitDx=0;exitDy=0;entryX=0.500;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-39" target="2GiTNw1I56buVSM36ilE-35">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="240" y="2180" />
<mxPoint x="357" y="2180" />
<mxPoint x="357" y="1640" />
<mxPoint x="637" y="1640" />
<mxPoint x="637" y="1300" />
<mxPoint x="397" y="1300" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-177" value="«create»" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-176">
<mxGeometry x="587" y="1545" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-178" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.500;exitY=0.000;exitDx=0;exitDy=0;entryX=0.167;entryY=0.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-39" target="2GiTNw1I56buVSM36ilE-38">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="137" y="3200" />
<mxPoint x="197" y="3200" />
<mxPoint x="197" y="2160" />
<mxPoint x="437" y="2160" />
<mxPoint x="437" y="1800" />
<mxPoint x="521" y="1800" />
</Array>
</mxGeometry>
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-179" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-178">
<mxGeometry x="186" y="3190" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-180" value="1" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-178">
<mxGeometry x="372" y="2140" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-181" value="viewModel" style="edgeLabel;resizable=0;html=1;align=left;verticalAlign=top;strokeColor=default;" vertex="1" connectable="0" parent="2GiTNw1I56buVSM36ilE-178">
<mxGeometry x="437" y="2150" as="geometry" />
</mxCell>
<mxCell id="2GiTNw1I56buVSM36ilE-182" value="" style="html=1;rounded=1;edgeStyle=orthogonalEdgeStyle;dashed=0;startArrow=diamondThinstartSize=12;endArrow=openThin;endSize=12;strokeColor=#595959;exitX=0.250;exitY=0.000;exitDx=0;exitDy=0;entryX=0.750;entryY=1.000;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="2GiTNw1I56buVSM36ilE-42" target="2GiTNw1I56buVSM36ilE-22">
<mxGeometry width="50" height="50" relative="1" as="geometry">
<Array as="points">
<mxPoint x="1186" y="1240" />
<mxPoint x="1177" y="1240" />