Add solution to problem 6

This commit is contained in:
2025-12-06 11:54:15 -05:00
parent efcc76f416
commit 4cfd2ea5cb
3 changed files with 142 additions and 0 deletions

66
Problem6_1.py Normal file
View File

@@ -0,0 +1,66 @@
def printList(numbersList: list[list[int]], symbolsList: list[str]) :
for line in numbersList :
print(f"{line}")
print(f"{symbolsList}")
def parseInput() :
numbers: list[list[int]] = []
for cnt in range(len(rawInput) - 1) :
line = rawInput[cnt]
numbers.append([])
for num in line.split(" ") :
if len(num.replace(" ", "")) == 0 :
continue
numbers[cnt].append(int(num))
symbols: list[str] = []
for sym in rawInput[-1].split(" ") :
if len(sym.replace(" ", "")) == 0:
continue
symbols.append(sym.replace(" ", ""))
return numbers, symbols
def getValue(col: list[int], symbol: str) :
if symbol == "+" :
return sum(col)
else :
return prod(col)
def prod(list: list[int]) :
if len(list) == 0 :
return 0
value = 1
for val in list :
value *= val
return value
testInput = [
"123 328 51 64 ",
" 45 64 387 23 ",
" 6 98 215 314",
"* + * + "
]
def readFile() :
ary = []
with open("files/Problem6.txt", "r") as file :
for line in file :
ary.append(line.replace("\n", ""))
return ary
#rawInput = testInput
rawInput = readFile()
numbers, symbols = parseInput()
#printList(numbers, symbols)
values: list[int] = []
for colNum in range(len(numbers[0])) :
col: list[int] = []
for rowNum in range(len(numbers)) :
col.append(numbers[rowNum][colNum])
value = getValue(col, symbols[colNum])
values.append(value)
print(f"Sum = {sum(values)}")
#Sum = 6891729672676

71
Problem6_2.py Normal file
View File

@@ -0,0 +1,71 @@
def printList(numbersList: list[list[int]], symbolsList: list[str]) :
for line in numbersList :
print(f"{line}")
print(f"{symbolsList}")
def parseInput() :
numbers: list[list[int]] = [[]]
for colNum in range(len(rawInput[0])) :
numStr = ""
for rowNum in range(len(rawInput) - 1) :
char = rawInput[rowNum][colNum]
if char != " " :
numStr += char
if len(numStr) > 0 :
numbers[-1].append(int(numStr))
elif len(numbers[-1]) > 0:
numbers.append([])
if len(numbers[-1]) == 0 :
numbers.pop()
symbols: list[str] = []
for sym in rawInput[-1].split(" ") :
if len(sym.replace(" ", "")) == 0:
continue
symbols.append(sym.replace(" ", ""))
return numbers, symbols
def getValue(col: list[int], symbol: str) :
if symbol == "+" :
value = sum(col)
else :
value = prod(col)
print(f"list = {col}, sym = {symbol}, Value = {value}")
return value
def prod(list: list[int]) :
if len(list) == 0 :
return 0
value = 1
for val in list :
value *= val
return value
testInput = [
"123 328 51 64 ",
" 45 64 387 23 ",
" 6 98 215 314",
"* + * + "
]
def readFile() :
ary = []
with open("files/Problem6.txt", "r") as file :
for line in file :
ary.append(line.replace("\n", ""))
return ary
#rawInput = testInput
rawInput = readFile()
numbers, symbols = parseInput()
#printList(numbers, symbols)
values: list[int] = []
for colNum in range(len(numbers)) :
value = getValue(numbers[colNum], symbols[colNum])
values.append(value)
print(f"Sum = {sum(values)}")
#Sum = 9770311947567

5
files/Problem6.txt Normal file
View File

@@ -0,0 +1,5 @@
38 346 33 62 25 368 69 528 89 136 23 43 88 61 724 75 25 7 96 6 7861 3 76 79 2763 31 31 338 37 566 32 38 847 224 94 8 6 2 683 91 572 39 3286 2 33 43 1327 7 61 982 5 127 64 4761 829 567 924 6 494 43 71 6 289 8 1 78 94 746 5 35 832 23 344 41 769 68 59 53 3 25 6 1 727 11 67 544 9 84 3 2 6381 21 732 65 2549 21 352 5579 37 51 53 72 523 648 1 28 2 498 9 6 14 332 94 78 5 224 2 196 924 52 39 9 963 82 369 6 5 78 39 65 6424 1 8 449 33 96 42 486 698 83 2 378 2 251 75 5 4 88 45 6225 52 57 87 32 71 39 63 7 87 74 366 33 33 494 174 258 219 1 92 45 29 42 5 314 7 417 844 45 86 67 2 7 1 626 3 418 718 66 1 9439 5 66 648 2828 245 6338 661 9766 35 5 58 763 57 426 38 45 66 152 852 116 28 9686 74 7 16 94 4 4 12 624 823 197 327 73 18 4 4354 4 979 595 2731 3473 73 94 48 9 42 85 48 11 4 42 2 669 57 65 4 1 256 787 4 25 876 59 543 3 94 66 456 6 3875 3216 13 46 99 96 8 4683 22 84 483 71 88 75 925 2 19 565 82 3 7299 695 4 63 7 573 9 25 36 96 5 28 7487 86 24 6196 17 1 966 656 679 731 1779 93 4 264 1 48 8538 653 1376 13 99 3 83 6492 9 224 4 5626 15 6 9761 9 2 35 58 5613 96 196 9 928 25 69 38 2 5 84 86 6 95 2229 648 714 43 198 467 6 7 4136 464 66 6893 7545 2 4 173 1 9 538 38 213 7592 546 9 6 52 28 9 48 326 25 54 497 9635 61 52 55 82 11 7967 314 96 75 9 63 381 636 23 72 14 79 786 746 55 921 5 4645 624 5 99 8 2 747 84 887 7568 8786 8 8185 676 16 76 77 15 6 918 83 928 3 51 782 44 21 18 1 485 685 746 265 366 17 93 581 9845 522 2485 795 358 9184 2911 6 8 39 2 8538 26 6 12 558 14 1 65 33 45 315 26 533 2 324 67 9578 218 67 745 812 47 38 243 687 673 3214 483 32 624 58 48 49 9 57 2837 15 929 6 83 5 74 333 353 99 68 264 7 8531 5 51 466 217 85 12 45 46 528 4 28 39 653 2285 53 489 57 92 53 17 727 7 8156 86 46 174 49 718 825 7 9179 168 15 622 66 439 778 472 64 338 136 39 7 45 562 88 61 156 465 92 832 5549 688 46 412 96 57 87 361 53 222 694 5 141 65 1213 4 7 31 1 96 678 14 8647 1 22 45 97 81 589 16 63 358 3 2 455 384 81 843 222 271 76 45 94 83 526 17 22 226 53 919 21 7 53 13 9 265 3 75 94 67 5 33 2 13 174 5519 327 3682 23 5 9247 28 51 89 81 5 135 161 37 3 34 52 35 22 328 7 8357 17 339 229 81 54 53 3 2 965 5592 52 96 4 641 934 843 295 268 814 578 38 96 774 2796 911 55 1215 66 18 69 43 28 668 88 56 91 95 9 142 96 61 1149 66 135 46 72 3214 81 3666 798 596 3 34 432 1 56 9 788 5 369 95 771 4 263 15 5396 95 89 765 6881 6 3 54 26 521 42 83 42 89 616 4696 418 68 827 71 75 4952 454 58 243 62 27 3 5 544 713 4 91 65 78 4 9718 25 671 662 25 2587 583 2 93 11 293 8 82 87 832 383 26 81 77 284 82 14 89 71 66 31 17 22 183 835 9 7 749 365 4 311 3837 2 2 55 989 861 25 2 6 5 2 919 482 57 92 6451 329 171 478 69 2 232 5 34 52 426 12 896 19 698 7 79 95 65 66 66 879 3 36 5766 6 6 962 4 625 43 936 132 6198 56 8 22 4 27 8 24 493 61 96 3247 8 369 138 746 556 872 7 46 17 48 92 422 98 731 13 98 9 526 8 67 1 2222 795 69 66 129 99 95 87 52 91 34 37 96 868 439 2748 525 7 34 756 9866 4 2 87 91 472 699 1661 74 94 982 999 74 5 338 17 866 5 885 558 62 9683 395 723 73 67 724 411 3 7 37 97 53 4 558 51 695 6 7 26 38 31 6 3 588 5 1699 824 59 9 185 8182 838 218 492 9 5 595 988 73 317 71 377 155 1768 58 538 48 28 95 95 2 37 27 4 62 64 33 254 77 491 6 56 3 77 363 6 66 346 2 46 3 5 7 85 733 428 88 28 573 85 15 2 87 9616 47 73 782 1 198 5 893 92 4 31 351 3194 767 2452 42 6199 7 93 3 57 551 686 644 16 5386
93 288 12 17 22 518 37 667 55 98 331 99 84 78 799 49 73 3794 61 82 836 66 43 84 2682 31 886 585 264 256 42 75 647 464 51 33 4 6 32 66 575 35 8675 32 59 52 8386 7 61 596 72 42 73 8994 945 527 511 839 899 49 825 8 693 944 622 275 24 442 37 2943 342 613 578 22 77 893 55 66 4 89 38 26 276 81 35 765 718 83 83 29 1191 43 351 994 6759 41 658 3157 12 26 55 4 823 1831 8 823 6 6293 44 588 69 794 27 56 53 97 29 623 747 876 51 84 642 522 9562 97 88 8529 54 43 2256 9 81 399 3 28 56 216 994 322 5 538 3 867 417 2 136 26 79 2963 25 61 9 59 767 593 95 9 16 16 8721 31 78 639 99 9142 546 88 93 51 22 89 8861 445 3 269 759 83 23 16 73 39 7 816 9987 831 158 36 69 6244 1 715 493 6641 8294 7314 717 4883 81 1 55 662 275 118 33 49 897 583 383 328 16 196 7629 6 75 26 54 23 74 95 782 653 941 41 3 6 673 62 683 863 5271 8563 75 96 1837 18 24 95 91 39 113 16 936 453 64 97 79 652 592 215 72 28 542 81 931 46 37 98 9291 97 5396 4393 51 47 81 132 1 375 552 15 556 42 376 87 453 47 521 11 41 3 911 548 15 82 9 288 1 24 19 68 3 93 7693 344 99 8754 51 94 289 667 847 341 3757 59 96 574 37 42 271 5425 981 536 31 46 33 6486 66 39 791 4956 37 223 4796 3458 77 34 28 3445 113 824 61 238 826 76 35 6 92 75 78 427 24 5827 486 641 51 787 549 6 9 7272 375 35 375 3675 62 23 34 5 2 129 5 898 6944 75 1 23 54 35 9 8 34 22 517 883 13 66 93 83 69 52 855 124 5 72 48 297 114 33 62 66 65 99 818 553 29 15 32 4661 854 981 94 7 3 576 744 787 5257 9444 4 9521 335 92 78 22 14 652 145 4 513 77 8177 197 22 893 59 66 642 915 987 718 678 89 898 294 1946 492 1459 384 42 6658 1199 8 18 97 81 5575 26 711 19 183 41 97 75 12 82 669 36 197 87 223 13 6176 231 38 911 985 18 13 415 288 861 818 188 97 929 45 71 66 2523 73 385 142 155 8 262 79 69 384 972 79 87 274 9 3668 38 6675 643 731 53 36 44 33 723 9 79 76 255 534 536 181 537 31 41 63 562 2 951 168 79 353 45 467 124 885 3282 647 79 752 34 82 335 198 681 672 113 29 7 21 114 349 36 678 122 566 825 5683 498 17 393 313 61 95 975 375 998 271 675 58 59 4734 8 2 97 2 19 734 21 4311 1 39 48 81 61 365 437 516 926 644 587 878 561 84 947 365 536 97 988 19 43 976 239 81 414 66 537 83 35 193 53 39 285 98 864 96 59 58 73 272 54 591 995 81 5755 33 26 7642 77 22 46 33 327 685 681 45 33 654 81 457 139 691 25 3626 534 934 698 73 6 721 764 28 285 5146 182 65 79 14 834 346 884 949 923 98 864 93 848 2677 655 11 486 8711 387 19 41 78 323 68 12 11 39 99 212 52 63 3328 45 699 82 89 8258 698 442 957 578 77 87 391 3 62 2 296 14 145 55 742 377 655 63 918 72 36 196 1667 68 43 88 145 666 292 6481 99 76 519 8571 572 15 542 72 9 6118 983 67 691 63 46 7 14 887 652 385 55 95 132 9 5145 71 448 892 211 1246 858 394 39 42 289 27 53 11 913 881 77 72 32 67 21 292 26 257 45 56 88 34 127 726 2 59 153 945 85 872 7426 9 85 82 89 572 91 9 6 65 1 483 989 636 95 7695 784 717 567 81 62 933 93 79 24 447 19 975 569 531 5 57 694 28 61 8958 948 84 6 4456 597 95 875 57 75 51 71 381 7682 66 6 29 46 34 92 858 1734 19 69 9637 5 576 158 984 524 271 8 73 73 9167 83 357 45 637 4729 16 4 261 633 23 9 7578 236 74 8188 697 61 37 23 78 46 76 263 98 896 259 967 517 4 17 237 697 43 36 19 78 27 35 6612 172 63 596 519 51 59 971 6 4993 7 111 788 71 586 185 446 75 6127 386 454 84 98 64 45 97 88 192 14 78 446 27 29 47 48 8 9 262 27 5646 214 5666 49 751 7539 9554 795 452 9 19 593 765 47 888 64 938 165 881 86 712 73 4 75 78 8 87 3 2 22 67 94 975 57 438 73 28 84 49 718 5 87 818 28 95 46 33 24 39 475 69 81 39 347 81 264 19 73 562 233 91 297 3 123 63 217 82 9 95 693 179 364 7897 78 6796 9 26 55 173 737 967 477 47 1253
15 14 793 38 82 598 29 922 32 92 413 322 28 87 783 54 82 3366 91 67 2 96 889 9 336 33 848 329 1493 69 16 47 994 49 38 27 54 9 3 38 1265 53 517 31 23 4972 272 66 78 892 61 14 37 933 799 268 484 643 21 71 983 45 737 225 561 959 81 746 75 4665 77 937 37 18 85 413 679 94 49 43 52 41 251 29 89 639 412 51 67 11 1684 75 9 431 533 94 371 319 69 69 52 1 68 4426 76 648 54 6129 92 135 64 762 124 39 933 43 488 862 46 978 62 18 164 353 2291 725 28 2237 2 86 681 29 74 582 2 11 196 522 9 679 49 624 7 893 417 194 168 64 78 3 82 6 3 76 4915 721 43 15 8 11 2262 51 59 892 7 1187 425 87 12 49 99 31 4875 13 58 925 593 52 11 21 984 45 16 243 5857 429 792 579 38 15 26 456 25 588 5258 6566 5481 72 18 147 59 578 598 961 79 24 359 293 341 39 64 137 6565 1 25 31 28 76 44 74 6694 654 922 35 2 96 476 59 826 8 7243 1922 9 65 2933 52 91 3 1 89 518 47 812 172 178 76 81 128 16 69 52 16 899 77 63 43 74 25 5252 743 51 7461 72 33 23 776 7 987 121 33 7633 81 964 14 415 35 187 25 6776 57 247 345 24 58 17 369 69 93 85 18 99 24 5796 667 44 4135 41 93 723 439 594 214 5639 46 348 933 151 39 87 3322 955 1494 492 28 63 1897 379 57 652 3281 584 498 3431 4624 75 22 729 396 8384 876 35 624 773 81 71 16 484 59 169 5154 75 2449 539 759 2 321 98 82 22 951 362 9 6 552 4822 62 36 191 71 61 3 737 784 15 52 841 2 72 22 8 6 13 731 394 83 148 67 9 76 68 68 666 6 51 3825 142 231 86 77 6 75 59 781 236 31 75 391 486 776 682 85 531 94 162 995 28 929 5865 26 656 65 43 742 68 23 968 693 4 368 595 7263 797 35 215 37 4465 872 136 155 98 415 75 828 84 2674 422 1956 15 83 973 2219 93 44 6 21 4289 32 1845 585 54 399 958 17 79 92 72 9524 32 22 176 138 3622 19 73 585 34 92 15 586 1161 148 444 373 33 345 133 31 3 6333 98 85 581 72 28 384 78 38 3385 8723 33 79 62 47 86 64 8338 958 355 91 85 7 92 938 71 669 22 643 894 157 44 765 89 22 56 642 69 72 986 3 648 181 655 57 116 3884 628 187 665 42 28 763 95 218 994 459 83 43 51 29 429 71 318 475 551 974 462 447 92 965 146 912 1 212 4127 339 78 158 63 41 1354 59 75 4 177 64 651 71 452 47 75 34 622 4 173 352 543 71 567 767 761 831 96 63 21 542 48 158 2 771 356 889 43 53 41 852 8 54 623 93 96 362 76 786 78 97 33 6 877 31 358 916 49 8322 37 76 1111 52 86 94 73 455 597 337 33 22 747 28 843 7675 127 28 9366 6436 77 947 13 5 536 572 847 147 7889 945 12 38 77 533 7829 594 473 688 69 123 1 341 3444 598 5 674 6699 293 646 21 74 65 39 19 64 21 86 954 1 78 8841 97 375 74 7 6393 9225 258 871 573 941 92 96 66 28 1 184 234 333 83 795 744 9633 11 35 96 58 192 2458 37 92 75 585 839 941 6358 79 59 591 1294 7 1 583 73 5 3831 435 14 463 237 33 19 519 34 535 199 64 75 863 7 7465 91 25 963 232 672 26 927 29 27 297 65 7 44 466 563 74 86 43 19 287 618 59 842 939 1 8 43 9875 764 8 59 276 777 27 434 957 22 24 69 6 978 15 322 673 51 121 442 452 374 4 414 286 447 311 82 14 2864 83 91 49 5 94 6 858 416 81 32 747 119 18 3299 827 28 9 1522 926 26 717 199 22 46 44 731 7982 75 8 92 12 24 21 475 2962 38 1667 2584 18 51 4 74 431 659 23 35 65 1716 18 634 42 774 7225 59 14 938 549 8 81 4498 684 175 9613 114 3 37 781 31 37 195 875 29 833 229 897 68 75 64 571 121 52 43 213 85 47 26 1597 457 91 33 833 89 85 813 8 2972 62 297 171 96 118 99 961 13 6615 235 798 465 14 75 27 63 46 897 83 42 681 66 72 14 29 9 85 76 88 525 476 2163 82 116 4548 7952 276 637 66 6263 783 263 78 92 93 199 316 586 22 925 15 2 93 76 45 7 2 18 46 57 63 914 41 484 25 81 442 55 3773 92 16 44 83 97 864 23 13 46 936 45 31 15 427 869 288 44 99 23 481 61 57 69 763 38 8 65 477 53 135 36 886 149 75 193 6 4 87 511 256 696 124 39 3918
71 84 644 94 5 499 7 89 5 97 916 385 63 78 947 73 61 6752 935 45 5 46 9153 1 7 61 593 1 3459 79 85 24 614 91 9 64 24 92 7 67 2647 33 26 42 29 3429 19 824 72 457 36 17 1 687 1 3158 553 3597 2 76 422 92 24 792 522 915 969 678 176 1349 62 242 38 1 3 728 749 38 37 34 57 17 577 76 15 817 479 24 96 69 266 44 3 482 62 18 48 11 7 31 2 5 5 1887 45 994 22 7224 23 2711 11 327 5328 38 914 79 644 812 85 716 97 27 352 546 4131 242 43 3279 7 55 41 73 29 22 9 6 559 7 3 983 51 634 87 378 295 799 968 255 9 5 75 2 9 54 8395 411 514 124 9 3 7721 24 84 32 1 8349 51 76 61 27 98 357 2596 48 85 7737 336 37 4 46 591 71 65 33 4935 87 364 483 9895 33 52 717 92 66 9334 1328 5483 38 51 443 751 682 656 7696 6 33 541 9 5 16 58 943 1524 47 5 9 13 758 34 92 5899 964 6 52 5 96 43 97 4 6 445 688 4 69 7857 44 15 9 8 61 451 84 496 954 888 2 52 1153 5 83 43 8 356 23 74 11 2 3 2678 966 67 77 9 14 26 945 71 48 566 91 1413 14 515 66 431 71 865 1 2689 48 78 54 89 58 21 9247 56 83 36 45 23 8 779 993 49 1622 55 42 3 896 7 158 5852 1 919 96 471 6 8 7441 76 4933 712 339 14 1 3431 9 546 479 946 491 7551 8397 38 8 584 43 4731 272 39 923 436 12 43 71 638 91 276 4322 14 1 487 956 8 855 8 73 14 677 755 4 8 19 4666 34 15 667 98 59 6 973 246 81 52 581 2 4 28 7 5 77 646 917 36 446 82 7 74 87 89 558 5 75 8251 656 86 88 4 2 93 18 7 64 87 33 238 97 6 838 8 839 28 345 419 75 834 79 45 899 1 2 374 19 6 6664 976 2 849 533 1895 613 9 919 81 8246 861 391 574 27 519 4 279 5 3229 829 384 31 49 28 163 47 69 4 25 2437 75 4562 747 23 535 355 41 79 56 77 8693 83 14 28 698 1466 63 53 175 59 29 13 27 7744 95 36 83 9 72 982 41 4 2767 39 8 675 86 692 471 26 66 5693 6219 6 6 72 98 89 32 6662 66 94 19 64 8 6 636 578 393 86 968 14 473 59 797 52 4 43 137 25 33 6266 9 374 236 86 54 229 864 384 569 64 83 3 7 92 839 51 75 97 39 5 26 488 45 895 538 572 19 25 87 72 328 713 962 5 777 4984 68 9 8697 8 52 922 616 26 6 787 31 74 6 397 884 19 8 694 1 54 163 344 31 216 525 452 233 23 8 28 767 8 958 6 654 743 2417 3 6 35 439 8 63 839 235 52 733 32 832 12 8 79 9 321 14 21 34 34 6589 4 66 1437 76 1 78 98 934 181 18 78 57 388 73 3315 8884 137 56 445 6782 51 9 94 9 697 934 553 77 681 584 97 55 6 6 3349 524 19 14 51 8725 2 639 893 722 3 89 7516 746 635 8 62 32 5 41 9 8 93 19 1 91 985 15 543 79 4 3386 6869 129 49 689 215 68 69 66 8 11 942 657 521 84 519 988 4355 34 6 66 92 953 59 64 47 44 817 54 427 5183 37 6 261 7796 3 4 197 98 7 238 46 58 184 244 38 44 326 99 249 1557 3 1 472 72 87 6 2 4 632 239 76 216 6 33 36 78 9 4 75 323 31 91 95 6 913 713 62 713 513 2 4 72 8727 359 54 5143 224 989 65 67 26 36 19 42 6 35 7 458 152 136 544 427 139 243 6 66 79 287 2 35 86 8834 73 41 66 2 33 3 418 44 26 98 576 727 1 1766 1 18 5 653 631 78 2 456 28 93 1 593 6 629 96 79 52 47 14 956 2193 81 6496 5 36 45 6 51 7 93 236 34 63 3423 86 21 85 92 1898 1 35 9 517 4 94 6614 98 642 5726 16 7 53 863 72 4 378 529 3 889 66 827 9 94 79 463 8 83 11 943 54 8 1 72 527 9 7 5148 96 45 844 5 3649 44 876 577 5 51 78 85 176 7773 8 1 329 13 25 58 72 36 336 892 89 723 57 8 1 5 265 17 6 22 533 36 2218 48 4 8134 4879 2 33 89 3167 899 1 6 3 29 113 4 53 87 925 47 8 97 2 48 2 7 22 56 64 28 34 7 217 13 24 984 27 4327 26 36 76 22 52 872 67 82 766 317 7 39 38 653 937 792 98 74 6 986 78 9 35 658 559 8 15 141 91 639 46 497 259 93 32 71 4 46 474 799 18 31 65 916
+ + * * * * * * * + + * + * * + * + + + + * + * + + + + + + * + + * + + + * + * + * + * * + + * + * + * * + * + + + * * * * * * + * + * * + + + * * * * * * + + + * + + * * * * * * + + * + + + * + * + + * + + + + * + * + + + + + * * + * + + + * + + + * * + * * + + * * * * * * * + + * * + + * + * * + * + + + + + + + + * + * + + * + + * * + * * + * * + + + * * * + * * + * + * + + + * * + + + + + + * * * + + * + + + * + + + + * * * + * + + + * + * + + + + * * + + * + + * * + + + * + * + + * * + + * * * * + * * * * + + + + + * * + * + + * + * + * * * * + + + + * * + * + * * * * * * + * + + + * * + * * + * + * * * + + + + * * * + + + * + * + + + + + * + + * * * * * * + + * + + * + * * + * + * * + * * + + + * * * + * * * + * + * * + * + * + * + + + * + * * + * * * + * * * * * * + * * * * + + * * + + * + + * + + + + * * + + + + * * + * + + * * * + + + * * + + * + + * + + + + + + * * * + + + + * * + * + + * + * * + * + * + + * + + * + * + * * + + * + + + + + + * * * * + + * * * * + + + * * + * * * * + + * + + + + + * * * + * + + + * + + + * + * * * + * * * * + + * * * + + * * * + * + * * + * + + * + * * + + * + * + * * + + * + * * + * * * * + * + + + * * + + * * * * + + + * * + + * + * * + * + * * * * * + * * + + + + + + * + + + + + * + * * * + + * + + + * + * + * * * * + + * + * * + * * * + + * * + * + + + * * * * * * * + + * * * * + * + + + + + + * * * * + * * * + * + * * + + * + + * * + * + * * * + + + * * + + * * * + + * * + * + * + * * + + + + + + + + + + + * + + + * + * * + * * * + * + * * * + * * * + + * + * * + * + + + * * * * * * + + + + * * + * * + + + + * * * * + * * + * * * + * + * + + + * + + * * * + + + * * + * + + * + + + + * + * * * + + * + + + * * + + * + * * + * + + + + * * + * + + * + + * * + + + + + + * * * * * * + + + + + * * + + + + * * * + * * * + * + * * + * + + + * * * * * * * + * + * + + + * + + + * * * + * + * * + * * + * * * + + * + + * * + + + * * + + * + + + + * + * * * + + + + * * * + + + * * + * * * + * + + * * * + + * + + + * + + + * * + + +