From 14b48eb21c0ec2f08ef6db9bb46fccc6796459cd Mon Sep 17 00:00:00 2001 From: Christophe de Dinechin Date: Tue, 12 Dec 2023 08:47:03 +0100 Subject: [PATCH] decimal: Add code to generate constants A single 10000-digit constant takes about 4K in QSPI space. Constants are generated in a cache and rebuilt when precision changes. For now, store pi, which we will need to implement sin/cos/tan Signed-off-by: Christophe de Dinechin --- Makefile | 6 + src/decimal-pi.h | 435 ++++++++++++++++++++++++++++++++++++ src/decimal-pi.txt | 1 + src/decimal.cc | 39 ++-- src/decimal.h | 19 +- tools/decimize/decimize.cpp | 2 +- 6 files changed, 484 insertions(+), 18 deletions(-) create mode 100644 src/decimal-pi.h create mode 100644 src/decimal-pi.txt diff --git a/Makefile b/Makefile index e3acc090..2afb94b7 100644 --- a/Makefile +++ b/Makefile @@ -387,7 +387,13 @@ $(TARGET).$(PGM): $(BUILD)/$(TARGET).elf Makefile $(CRCFIX) $(SIZE) $< wc -c $@ +DECIMAL_CONSTANTS=pi +DECIMAL_SOURCES=$(DECIMAL_CONSTANTS:%=src/decimal-%.h) +src/decimal-%.h: src/decimal-%.txt $(DECIMIZE) + $(DECIMIZE) < $< > $@ decimal_$* + $(OBJECTS): $(DECIMAL_SOURCES) $(VERSION_H) + sim: $(DECIMAL_SOURCES) $(BUILD)/%.hex: $(BUILD)/%.elf | $(BUILD) diff --git a/src/decimal-pi.h b/src/decimal-pi.h new file mode 100644 index 00000000..4386fc7d --- /dev/null +++ b/src/decimal-pi.h @@ -0,0 +1,435 @@ +// Decimal table for: +// 314 159 265 358 979 323 846 264 338 327 950 288 419 716 939 937 510 582 097 494 +// 459 230 781 640 628 620 899 862 803 482 534 211 706 798 214 808 651 328 230 664 +// 709 384 460 955 058 223 172 535 940 812 848 111 745 028 410 270 193 852 110 555 +// 964 462 294 895 493 038 196 442 881 097 566 593 344 612 847 564 823 378 678 316 +// 527 120 190 914 564 856 692 346 034 861 045 432 664 821 339 360 726 024 914 127 +// 372 458 700 660 631 558 817 488 152 092 096 282 925 409 171 536 436 789 259 036 +// 001 133 053 054 882 046 652 138 414 695 194 151 160 943 305 727 036 575 959 195 +// 309 218 611 738 193 261 179 310 511 854 807 446 237 996 274 956 735 188 575 272 +// 489 122 793 818 301 194 912 983 367 336 244 065 664 308 602 139 494 639 522 473 +// 719 070 217 986 094 370 277 053 921 717 629 317 675 238 467 481 846 766 940 513 +// 200 056 812 714 526 356 082 778 577 134 275 778 960 917 363 717 872 146 844 090 +// 122 495 343 014 654 958 537 105 079 227 968 925 892 354 201 995 611 212 902 196 +// 086 403 441 815 981 362 977 477 130 996 051 870 721 134 999 999 837 297 804 995 +// 105 973 173 281 609 631 859 502 445 945 534 690 830 264 252 230 825 334 468 503 +// 526 193 118 817 101 000 313 783 875 288 658 753 320 838 142 061 717 766 914 730 +// 359 825 349 042 875 546 873 115 956 286 388 235 378 759 375 195 778 185 778 053 +// 217 122 680 661 300 192 787 661 119 590 921 642 019 893 809 525 720 106 548 586 +// 327 886 593 615 338 182 796 823 030 195 203 530 185 296 899 577 362 259 941 389 +// 124 972 177 528 347 913 151 557 485 724 245 415 069 595 082 953 311 686 172 785 +// 588 907 509 838 175 463 746 493 931 925 506 040 092 770 167 113 900 984 882 401 +// 285 836 160 356 370 766 010 471 018 194 295 559 619 894 676 783 744 944 825 537 +// 977 472 684 710 404 753 464 620 804 668 425 906 949 129 331 367 702 898 915 210 +// 475 216 205 696 602 405 803 815 019 351 125 338 243 003 558 764 024 749 647 326 +// 391 419 927 260 426 992 279 678 235 478 163 600 934 172 164 121 992 458 631 503 +// 028 618 297 455 570 674 983 850 549 458 858 692 699 569 092 721 079 750 930 295 +// 532 116 534 498 720 275 596 023 648 066 549 911 988 183 479 775 356 636 980 742 +// 654 252 786 255 181 841 757 467 289 097 777 279 380 008 164 706 001 614 524 919 +// 217 321 721 477 235 014 144 197 356 854 816 136 115 735 255 213 347 574 184 946 +// 843 852 332 390 739 414 333 454 776 241 686 251 898 356 948 556 209 921 922 218 +// 427 255 025 425 688 767 179 049 460 165 346 680 498 862 723 279 178 608 578 438 +// 382 796 797 668 145 410 095 388 378 636 095 068 006 422 512 520 511 739 298 489 +// 608 412 848 862 694 560 424 196 528 502 221 066 118 630 674 427 862 203 919 494 +// 504 712 371 378 696 095 636 437 191 728 746 776 465 757 396 241 389 086 583 264 +// 599 581 339 047 802 759 009 946 576 407 895 126 946 839 835 259 570 982 582 262 +// 052 248 940 772 671 947 826 848 260 147 699 090 264 013 639 443 745 530 506 820 +// 349 625 245 174 939 965 143 142 980 919 065 925 093 722 169 646 151 570 985 838 +// 741 059 788 595 977 297 549 893 016 175 392 846 813 826 868 386 894 277 415 599 +// 185 592 524 595 395 943 104 997 252 468 084 598 727 364 469 584 865 383 673 622 +// 262 609 912 460 805 124 388 439 045 124 413 654 976 278 079 771 569 143 599 770 +// 012 961 608 944 169 486 855 584 840 635 342 207 222 582 848 864 815 845 602 850 +// 601 684 273 945 226 746 767 889 525 213 852 254 995 466 672 782 398 645 659 611 +// 635 488 623 057 745 649 803 559 363 456 817 432 411 251 507 606 947 945 109 659 +// 609 402 522 887 971 089 314 566 913 686 722 874 894 056 010 150 330 861 792 868 +// 092 087 476 091 782 493 858 900 971 490 967 598 526 136 554 978 189 312 978 482 +// 168 299 894 872 265 880 485 756 401 427 047 755 513 237 964 145 152 374 623 436 +// 454 285 844 479 526 586 782 105 114 135 473 573 952 311 342 716 610 213 596 953 +// 623 144 295 248 493 718 711 014 576 540 359 027 993 440 374 200 731 057 853 906 +// 219 838 744 780 847 848 968 332 144 571 386 875 194 350 643 021 845 319 104 848 +// 100 537 061 468 067 491 927 819 119 793 995 206 141 966 342 875 444 064 374 512 +// 371 819 217 999 839 101 591 956 181 467 514 269 123 974 894 090 718 649 423 196 +// 156 794 520 809 514 655 022 523 160 388 193 014 209 376 213 785 595 663 893 778 +// 708 303 906 979 207 734 672 218 256 259 966 150 142 150 306 803 844 773 454 920 +// 260 541 466 592 520 149 744 285 073 251 866 600 213 243 408 819 071 048 633 173 +// 464 965 145 390 579 626 856 100 550 810 665 879 699 816 357 473 638 405 257 145 +// 910 289 706 414 011 097 120 628 043 903 975 951 567 715 770 042 033 786 993 600 +// 723 055 876 317 635 942 187 312 514 712 053 292 819 182 618 612 586 732 157 919 +// 841 484 882 916 447 060 957 527 069 572 209 175 671 167 229 109 816 909 152 801 +// 735 067 127 485 832 228 718 352 093 539 657 251 210 835 791 513 698 820 914 442 +// 100 675 103 346 711 031 412 671 113 699 086 585 163 983 150 197 016 515 116 851 +// 714 376 576 183 515 565 088 490 998 985 998 238 734 552 833 163 550 764 791 853 +// 589 322 618 548 963 213 293 308 985 706 420 467 525 907 091 548 141 654 985 946 +// 163 718 027 098 199 430 992 448 895 757 128 289 059 232 332 609 729 971 208 443 +// 357 326 548 938 239 119 325 974 636 673 058 360 414 281 388 303 203 824 903 758 +// 985 243 744 170 291 327 656 180 937 734 440 307 074 692 112 019 130 203 303 801 +// 976 211 011 004 492 932 151 608 424 448 596 376 698 389 522 868 478 312 355 265 +// 821 314 495 768 572 624 334 418 930 396 864 262 434 107 732 269 780 280 731 891 +// 544 110 104 468 232 527 162 010 526 522 721 116 603 966 655 730 925 471 105 578 +// 537 634 668 206 531 098 965 269 186 205 647 693 125 705 863 566 201 855 810 072 +// 936 065 987 648 611 791 045 334 885 034 611 365 768 675 324 944 166 803 962 657 +// 978 771 855 608 455 296 541 266 540 853 061 434 443 185 867 697 514 566 140 680 +// 070 023 787 765 913 440 171 274 947 042 056 223 053 899 456 131 407 112 700 040 +// 785 473 326 993 908 145 466 464 588 079 727 082 668 306 343 285 878 569 830 523 +// 580 893 306 575 740 679 545 716 377 525 420 211 495 576 158 140 025 012 622 859 +// 413 021 647 155 097 925 923 099 079 654 737 612 551 765 675 135 751 782 966 645 +// 477 917 450 112 996 148 903 046 399 471 329 621 073 404 375 189 573 596 145 890 +// 193 897 131 117 904 297 828 564 750 320 319 869 151 402 870 808 599 048 010 941 +// 214 722 131 794 764 777 262 241 425 485 454 033 215 718 530 614 228 813 758 504 +// 306 332 175 182 979 866 223 717 215 916 077 166 925 474 873 898 665 494 945 011 +// 465 406 284 336 639 379 003 976 926 567 214 638 530 673 609 657 120 918 076 383 +// 271 664 162 748 888 007 869 256 029 022 847 210 403 172 118 608 204 190 004 229 +// 661 711 963 779 213 375 751 149 595 015 660 496 318 629 472 654 736 425 230 817 +// 703 675 159 067 350 235 072 835 405 670 403 867 435 136 222 247 715 891 504 953 +// 098 444 893 330 963 408 780 769 325 993 978 054 193 414 473 774 418 426 312 986 +// 080 998 886 874 132 604 721 569 516 239 658 645 730 216 315 981 931 951 673 538 +// 129 741 677 294 786 724 229 246 543 668 009 806 769 282 382 806 899 640 048 243 +// 540 370 141 631 496 589 794 092 432 378 969 070 697 794 223 625 082 216 889 573 +// 837 986 230 015 937 764 716 512 289 357 860 158 816 175 578 297 352 334 460 428 +// 151 262 720 373 431 465 319 777 741 603 199 066 554 187 639 792 933 441 952 154 +// 134 189 948 544 473 456 738 316 249 934 191 318 148 092 777 710 386 387 734 317 +// 720 754 565 453 220 777 092 120 190 516 609 628 049 092 636 019 759 882 816 133 +// 231 666 365 286 193 266 863 360 627 356 763 035 447 762 803 504 507 772 355 471 +// 058 595 487 027 908 143 562 401 451 718 062 464 362 679 456 127 531 813 407 833 +// 033 625 423 278 394 497 538 243 720 583 531 147 711 992 606 381 334 677 687 969 +// 597 030 983 391 307 710 987 040 859 133 746 414 428 227 726 346 594 704 745 878 +// 477 872 019 277 152 807 317 679 077 071 572 134 447 306 057 007 334 924 369 311 +// 383 504 931 631 284 042 512 192 565 179 806 941 135 280 131 470 130 478 164 378 +// 851 852 909 285 452 011 658 393 419 656 213 491 434 159 562 586 586 557 055 269 +// 049 652 098 580 338 507 224 264 829 397 285 847 831 630 577 775 606 888 764 462 +// 482 468 579 260 395 352 773 480 304 802 900 587 607 582 510 474 709 164 396 136 +// 267 604 492 562 742 042 083 208 566 119 062 545 433 721 315 359 584 506 877 246 +// 029 016 187 667 952 406 163 425 225 771 954 291 629 919 306 455 377 991 403 734 +// 043 287 526 288 896 399 587 947 572 917 464 263 574 552 540 790 914 513 571 113 +// 694 109 119 393 251 910 760 208 252 026 187 985 318 877 058 429 725 916 778 131 +// 496 990 090 192 116 971 737 278 476 847 268 608 490 033 770 242 429 165 130 050 +// 051 683 233 643 503 895 170 298 939 223 345 172 201 381 280 696 501 178 440 874 +// 519 601 212 285 993 716 231 301 711 444 846 409 038 906 449 544 400 619 869 075 +// 485 160 263 275 052 983 491 874 078 668 088 183 385 102 283 345 085 048 608 250 +// 393 021 332 197 155 184 306 354 550 076 682 829 493 041 377 655 279 397 517 546 +// 139 539 846 833 936 383 047 461 199 665 385 815 384 205 685 338 621 867 252 334 +// 028 308 711 232 827 892 125 077 126 294 632 295 639 898 989 358 211 674 562 701 +// 021 835 646 220 134 967 151 881 909 730 381 198 004 973 407 239 610 368 540 664 +// 319 395 097 901 906 996 395 524 530 054 505 806 855 019 567 302 292 191 393 391 +// 856 803 449 039 820 595 510 022 635 353 619 204 199 474 553 859 381 023 439 554 +// 495 977 837 790 237 421 617 271 117 236 434 354 394 782 218 185 286 240 851 400 +// 666 044 332 588 856 986 705 431 547 069 657 474 585 503 323 233 421 073 015 459 +// 405 165 537 906 866 273 337 995 851 156 257 843 229 882 737 231 989 875 714 159 +// 578 111 963 583 300 594 087 306 812 160 287 649 628 674 460 477 464 915 995 054 +// 973 742 562 690 104 903 778 198 683 593 814 657 412 680 492 564 879 855 614 537 +// 234 786 733 039 046 883 834 363 465 537 949 864 192 705 638 729 317 487 233 208 +// 376 011 230 299 113 679 386 270 894 387 993 620 162 951 541 337 142 489 283 072 +// 201 269 014 754 668 476 535 761 647 737 946 752 004 907 571 555 278 196 536 213 +// 239 264 061 601 363 581 559 074 220 202 031 872 776 052 772 190 055 614 842 555 +// 187 925 303 435 139 844 253 223 415 762 336 106 425 063 904 975 008 656 271 095 +// 359 194 658 975 141 310 348 227 693 062 474 353 632 569 160 781 547 818 115 284 +// 366 795 706 110 861 533 150 445 212 747 392 454 494 542 368 288 606 134 084 148 +// 637 767 009 612 071 512 491 404 302 725 386 076 482 363 414 334 623 518 975 766 +// 452 164 137 679 690 314 950 191 085 759 844 239 198 629 164 219 399 490 723 623 +// 464 684 411 739 403 265 918 404 437 805 133 389 452 574 239 950 829 659 122 850 +// 855 582 157 250 310 712 570 126 683 024 029 295 252 201 187 267 675 622 041 542 +// 051 618 416 348 475 651 699 981 161 410 100 299 607 838 690 929 160 302 884 002 +// 691 041 407 928 862 150 784 245 167 090 870 006 992 821 206 604 183 718 065 355 +// 672 525 325 675 328 612 910 424 877 618 258 297 651 579 598 470 356 222 629 348 +// 600 341 587 229 805 349 896 502 262 917 487 882 027 342 092 222 453 398 562 647 +// 669 149 055 628 425 039 127 577 102 840 279 980 663 658 254 889 264 880 254 566 +// 101 729 670 266 407 655 904 290 994 568 150 652 653 053 718 294 127 033 693 137 +// 851 786 090 407 086 671 149 655 834 343 476 933 857 817 113 864 558 736 781 230 +// 145 876 871 266 034 891 390 956 200 993 936 103 102 916 161 528 813 843 790 990 +// 423 174 733 639 480 457 593 149 314 052 976 347 574 811 935 670 911 013 775 172 +// 100 803 155 902 485 309 066 920 376 719 220 332 290 943 346 768 514 221 447 737 +// 939 375 170 344 366 199 104 033 751 117 354 719 185 504 644 902 636 551 281 622 +// 882 446 257 591 633 303 910 722 538 374 218 214 088 350 865 739 177 150 968 288 +// 747 826 569 959 957 449 066 175 834 413 752 239 709 683 408 005 355 984 917 541 +// 738 188 399 944 697 486 762 655 165 827 658 483 588 453 142 775 687 900 290 951 +// 702 835 297 163 445 621 296 404 352 311 760 066 510 124 120 065 975 585 127 617 +// 858 382 920 419 748 442 360 800 719 304 576 189 323 492 292 796 501 987 518 721 +// 272 675 079 812 554 709 589 045 563 579 212 210 333 466 974 992 356 302 549 478 +// 024 901 141 952 123 828 153 091 140 790 738 602 515 227 429 958 180 724 716 259 +// 166 854 513 331 239 480 494 707 911 915 326 734 302 824 418 604 142 636 395 480 +// 004 480 026 704 962 482 017 928 964 766 975 831 832 713 142 517 029 692 348 896 +// 276 684 403 232 609 275 249 603 579 964 692 565 049 368 183 609 003 238 092 934 +// 595 889 706 953 653 494 060 340 216 654 437 558 900 456 328 822 505 452 556 405 +// 644 824 651 518 754 711 962 184 439 658 253 375 438 856 909 411 303 150 952 617 +// 937 800 297 412 076 651 479 394 259 029 896 959 469 955 657 612 186 561 967 337 +// 862 362 561 252 163 208 628 692 221 032 748 892 186 543 648 022 967 807 057 656 +// 151 446 320 469 279 068 212 073 883 778 142 335 628 236 089 632 080 682 224 680 +// 122 482 611 771 858 963 814 091 839 036 736 722 208 883 215 137 556 003 727 983 +// 940 041 529 700 287 830 766 709 444 745 601 345 564 172 543 709 069 793 961 225 +// 714 298 946 715 435 784 687 886 144 458 123 145 935 719 849 225 284 716 050 492 +// 212 424 701 412 147 805 734 551 050 080 190 869 960 330 276 347 870 810 817 545 +// 011 930 714 122 339 086 639 383 395 294 257 869 050 764 310 063 835 198 343 893 +// 415 961 318 543 475 464 955 697 810 382 930 971 646 514 384 070 070 736 041 123 +// 735 998 434 522 516 105 070 270 562 352 660 127 648 483 084 076 118 301 305 279 +// 320 542 746 286 540 360 367 453 286 510 570 658 748 822 569 815 793 678 976 697 +// 422 057 505 968 344 086 973 502 014 102 067 235 850 200 724 522 563 265 134 105 +// 592 401 902 742 162 484 391 403 599 895 353 945 909 440 704 691 209 140 938 700 +// 126 456 001 623 742 880 210 927 645 793 106 579 229 552 498 872 758 461 012 648 +// 369 998 922 569 596 881 592 056 001 016 552 563 756 78 +// 10001 digits, 3334 kigits, 4168 bytes + +static const byte decimal_pi[4168] = +{ + 0x4E, 0x89, 0xF4, 0x25, 0x66, 0xF4, 0xD4, 0x3D, 0x39, 0x08, 0x54, 0x94, 0x7E, 0xD9, 0x20, 0x68, + 0xEC, 0xCE, 0xAF, 0xA9, 0x7F, 0xA4, 0x61, 0x85, 0xEE, 0x72, 0xCE, 0x6C, 0x36, 0x80, 0x9D, 0x26, + 0xCE, 0x0F, 0x5E, 0xC8, 0xDE, 0x28, 0x58, 0xD3, 0xB0, 0xB1, 0xE3, 0x5B, 0x28, 0xA2, 0xD4, 0x83, + 0x9A, 0x98, 0xB1, 0x58, 0x07, 0x33, 0xBB, 0x0E, 0x8D, 0xF2, 0xB2, 0x17, 0xEB, 0x32, 0xCD, 0x40, + 0x6F, 0xBA, 0x41, 0xC6, 0x69, 0x0E, 0x30, 0x75, 0x41, 0xBA, 0x2B, 0xF1, 0x1C, 0xE4, 0x9B, 0x7F, + 0x7B, 0x42, 0x63, 0x11, 0xBA, 0xDC, 0x46, 0x18, 0xDA, 0x51, 0x56, 0x26, 0x4D, 0x3E, 0x34, 0xCD, + 0xD7, 0xAA, 0x99, 0x3C, 0x83, 0xC7, 0x82, 0xFB, 0x92, 0x8D, 0x35, 0x8A, 0xD1, 0x5A, 0x08, 0xB5, + 0xD0, 0xB5, 0xB0, 0xA6, 0x33, 0x55, 0x4D, 0x68, 0xB5, 0x81, 0x8E, 0x48, 0x7F, 0x5D, 0x1C, 0xAA, + 0xF2, 0x94, 0x9D, 0xE2, 0xEC, 0xC5, 0xE8, 0x26, 0x05, 0xC1, 0x81, 0x1A, 0xE7, 0x59, 0x92, 0xAE, + 0x18, 0x6D, 0x31, 0x54, 0x0C, 0x24, 0x00, 0x48, 0x50, 0xD4, 0x36, 0xDC, 0x82, 0xEA, 0x30, 0x8A, + 0x67, 0xAB, 0x73, 0x08, 0x97, 0x28, 0x3A, 0xF4, 0xC6, 0xD7, 0x09, 0x23, 0xFE, 0xFC, 0xC3, 0x4D, + 0x4D, 0xA9, 0x8E, 0xE2, 0x30, 0x50, 0x52, 0xCD, 0x36, 0x7F, 0xF5, 0x6C, 0x9D, 0xBE, 0x3B, 0x7E, + 0x44, 0x4B, 0xBC, 0xB7, 0xCB, 0xC8, 0xFD, 0x10, 0x7A, 0x47, 0xAC, 0x67, 0x32, 0x4B, 0x4C, 0x2E, + 0x43, 0xD7, 0x5B, 0xD5, 0x03, 0xD0, 0x41, 0xA6, 0x13, 0x49, 0x68, 0x8B, 0x7B, 0xA7, 0xF8, 0x29, + 0xD9, 0xB3, 0xC4, 0x63, 0x67, 0xDA, 0x17, 0x97, 0x24, 0x54, 0x35, 0xE6, 0x6C, 0xD9, 0xD5, 0x3D, + 0xA8, 0xCE, 0xE7, 0x4D, 0xE1, 0xD3, 0xAF, 0xEE, 0xB2, 0x01, 0x32, 0x03, 0x8C, 0xB2, 0xCA, 0x83, + 0x96, 0x41, 0x4B, 0x0A, 0x90, 0x48, 0x64, 0x4F, 0x0A, 0xF0, 0x39, 0x55, 0xAE, 0xCD, 0xDA, 0x09, + 0x2D, 0x30, 0x5A, 0x1E, 0x9E, 0xF5, 0x5C, 0x0E, 0xA3, 0xBB, 0xE8, 0x64, 0x69, 0x13, 0xCE, 0x3F, + 0x23, 0x9D, 0xDF, 0x16, 0x23, 0x27, 0xE3, 0x98, 0xCD, 0x4E, 0x18, 0xC4, 0x15, 0x99, 0x36, 0xE7, + 0x2F, 0xF5, 0x56, 0xAF, 0x45, 0xDD, 0x20, 0xBE, 0x40, 0xCF, 0x66, 0xB4, 0x48, 0x6F, 0x9F, 0xE7, + 0xD1, 0x52, 0x9C, 0x93, 0xE3, 0x1A, 0x7C, 0xD2, 0xB5, 0x19, 0x98, 0x67, 0x7D, 0x6D, 0xF6, 0x6F, + 0x7B, 0x18, 0x5A, 0xB2, 0xCF, 0x90, 0x83, 0xF0, 0xE6, 0xCE, 0x54, 0xE7, 0x51, 0xF7, 0x83, 0x8C, + 0x11, 0xDB, 0x31, 0x19, 0x40, 0x04, 0xE7, 0x0F, 0xDA, 0xD2, 0x0A, 0x4A, 0xF1, 0x50, 0x34, 0x62, + 0x38, 0x3D, 0xB3, 0x6F, 0xEE, 0x4A, 0xDA, 0x59, 0xF3, 0x95, 0x74, 0x2A, 0xDA, 0xE2, 0x2D, 0xA4, + 0x73, 0xEF, 0x11, 0xE6, 0x10, 0xEB, 0x5E, 0xAF, 0x75, 0xDC, 0xC3, 0xC2, 0x8B, 0x9C, 0x28, 0x35, + 0x36, 0x47, 0xAA, 0xA2, 0x95, 0x4B, 0x0C, 0x0C, 0x4E, 0x95, 0x1D, 0xE4, 0xEE, 0x66, 0x82, 0x04, + 0xF7, 0xDC, 0xA6, 0x0D, 0xB4, 0x06, 0xA8, 0x92, 0x4A, 0x51, 0xF7, 0x69, 0x46, 0x67, 0x54, 0x8B, + 0x6C, 0x73, 0x37, 0x07, 0x8C, 0x33, 0x2E, 0x12, 0x2E, 0x52, 0x8E, 0x0E, 0x41, 0x5A, 0x90, 0x3E, + 0xB5, 0x85, 0x1F, 0x3C, 0xC2, 0xC6, 0x10, 0x56, 0xF9, 0x12, 0x5E, 0x2D, 0x79, 0x6D, 0x43, 0xD5, + 0x9F, 0x11, 0x65, 0x31, 0x4B, 0xB9, 0x4D, 0xEA, 0xE2, 0xB3, 0x11, 0x93, 0x38, 0xB7, 0xF7, 0x46, + 0x2B, 0xDC, 0xFB, 0xA9, 0xED, 0xE8, 0xF9, 0xD7, 0xE8, 0x28, 0x17, 0x30, 0x22, 0x9C, 0x71, 0xE1, + 0x3D, 0x8D, 0xC9, 0x91, 0x47, 0x74, 0x42, 0x81, 0x64, 0x5C, 0xAF, 0xE0, 0x29, 0xD7, 0x04, 0x8C, + 0x24, 0x9E, 0x2F, 0x9A, 0xF7, 0xEA, 0x93, 0x0F, 0xBA, 0x3B, 0x0C, 0xE6, 0x19, 0xF4, 0x5D, 0x8A, + 0xB2, 0xC6, 0x65, 0x2F, 0x17, 0x42, 0x6C, 0xC9, 0x29, 0xC6, 0xA7, 0x8A, 0xED, 0x48, 0x15, 0x2D, + 0x6F, 0xAF, 0xB8, 0x2E, 0x4C, 0xD2, 0x76, 0xCD, 0x83, 0x36, 0xB8, 0x96, 0x99, 0x5C, 0x8F, 0x2F, + 0x04, 0xD5, 0xF1, 0xF5, 0x52, 0x3C, 0xC0, 0x38, 0xBA, 0xFC, 0x06, 0x2E, 0xDA, 0x1D, 0x46, 0x61, + 0xDA, 0x3E, 0x7D, 0x04, 0x6A, 0xBE, 0x04, 0x5E, 0xA6, 0x3A, 0xDD, 0xE2, 0x8E, 0x58, 0xE9, 0x8A, + 0xC2, 0x90, 0x79, 0xF8, 0x1C, 0xA9, 0xDD, 0xF7, 0x07, 0x26, 0xA4, 0xA5, 0xC7, 0x8E, 0xAA, 0x2F, + 0x5F, 0x52, 0x89, 0x5C, 0xAD, 0x6A, 0xB4, 0xAE, 0xE3, 0x91, 0x72, 0xD1, 0x13, 0xEE, 0xEE, 0x89, + 0x27, 0x85, 0x07, 0x48, 0x59, 0xF2, 0xB4, 0x11, 0x39, 0x50, 0x17, 0xA2, 0x04, 0x28, 0x97, 0x8F, + 0xF7, 0x0B, 0x77, 0x7F, 0x07, 0x59, 0x27, 0xCF, 0x52, 0xE6, 0xA3, 0x8F, 0xCC, 0x48, 0xFF, 0x2D, + 0x74, 0x9B, 0xD5, 0xD3, 0x48, 0x46, 0x1C, 0x25, 0x17, 0x5F, 0x00, 0x82, 0x92, 0xC2, 0x00, 0x66, + 0x68, 0x33, 0x97, 0x36, 0x54, 0x1B, 0x45, 0xDD, 0x3A, 0xC0, 0xE2, 0x40, 0xC5, 0x59, 0x35, 0x6C, + 0xC0, 0x88, 0x1C, 0xED, 0xF3, 0xFC, 0xD5, 0x56, 0xE3, 0xE2, 0xE3, 0xB2, 0xD2, 0xF5, 0x45, 0x31, + 0x86, 0xB8, 0xD9, 0xE5, 0x35, 0xC6, 0xC2, 0x0F, 0x1A, 0xB8, 0xFB, 0xE0, 0x96, 0x4E, 0xD2, 0x2C, + 0x34, 0x79, 0x9E, 0x68, 0xDA, 0x6A, 0xCF, 0xF0, 0x65, 0xA9, 0xAC, 0x2F, 0xF2, 0xCC, 0x31, 0x73, + 0x0A, 0x55, 0x6A, 0xA8, 0x7C, 0xB5, 0xEB, 0x4D, 0x17, 0x2C, 0xA6, 0x09, 0x09, 0xB6, 0x5F, 0xB1, + 0xCC, 0x76, 0x9C, 0x24, 0x59, 0xA1, 0x7D, 0x84, 0x5E, 0xA7, 0xC1, 0x7C, 0x44, 0x01, 0x9A, 0x68, + 0x02, 0x08, 0x7F, 0xEE, 0x34, 0xA9, 0xE9, 0x98, 0x19, 0xCD, 0x43, 0x5E, 0xAD, 0xA3, 0x06, 0xA0, + 0xC4, 0x84, 0x1F, 0x63, 0x74, 0x42, 0x1D, 0xA7, 0x6A, 0x89, 0xAB, 0xD7, 0x8C, 0xBE, 0x5D, 0xEE, + 0x7E, 0x2C, 0x85, 0xCD, 0x7A, 0xAE, 0x05, 0xF9, 0xF1, 0xB5, 0x2F, 0xED, 0x8B, 0xAB, 0x08, 0x74, + 0x6F, 0x56, 0x30, 0xF1, 0x61, 0x45, 0x69, 0x1D, 0x08, 0x95, 0xE4, 0x55, 0x4C, 0x2F, 0xC8, 0xAF, + 0x70, 0x27, 0xB2, 0x90, 0x19, 0x7D, 0xFC, 0x7E, 0xEC, 0xB4, 0x7D, 0x0D, 0x03, 0x8E, 0xBD, 0x69, + 0x19, 0x06, 0x0D, 0x0F, 0x8E, 0xB3, 0x04, 0xA7, 0xFB, 0x3C, 0xEB, 0x50, 0x41, 0x09, 0x3A, 0xEC, + 0x5A, 0x42, 0x00, 0xD9, 0xFD, 0xBB, 0xBA, 0x61, 0x27, 0xEB, 0x34, 0x57, 0x67, 0x13, 0xD4, 0xAE, + 0xEA, 0xFC, 0x52, 0x3C, 0x8E, 0xF5, 0x39, 0x71, 0x07, 0x9D, 0x17, 0x6D, 0x22, 0xA6, 0x86, 0x25, + 0xE3, 0xAF, 0x67, 0x46, 0xB9, 0x43, 0xBC, 0x52, 0x53, 0xF4, 0x52, 0x98, 0x97, 0x7D, 0x04, 0x0A, + 0xF6, 0x23, 0x4E, 0xCB, 0x73, 0xAD, 0x91, 0x82, 0xDF, 0x91, 0x56, 0x7E, 0x57, 0x2E, 0x65, 0x08, + 0x32, 0x53, 0x62, 0xFA, 0xF1, 0xA3, 0xE5, 0x3F, 0x1D, 0x41, 0x52, 0x56, 0xB5, 0xD6, 0xC7, 0x56, + 0x48, 0xD8, 0x57, 0xFA, 0x86, 0x6E, 0x41, 0xA6, 0x1E, 0x41, 0xCC, 0xC9, 0x47, 0xC6, 0x11, 0xB7, + 0x0B, 0x47, 0xC6, 0x76, 0x8E, 0xF4, 0x11, 0x61, 0x3F, 0x03, 0x8E, 0x48, 0xF9, 0x5F, 0x02, 0x03, + 0x3C, 0x19, 0x83, 0xB0, 0x2A, 0x5E, 0x6D, 0x5E, 0x48, 0xD2, 0x27, 0xB5, 0x58, 0xCF, 0x37, 0xA4, + 0x6D, 0x43, 0x60, 0xCB, 0xF4, 0xD9, 0x6B, 0x52, 0x96, 0x6A, 0xC4, 0x47, 0xB1, 0x38, 0xAE, 0xAB, + 0xFF, 0x79, 0x83, 0x4D, 0x5D, 0x50, 0xFE, 0xF8, 0xDD, 0x2A, 0x83, 0x0E, 0x63, 0xA8, 0x5A, 0x4E, + 0x63, 0x9E, 0xDE, 0x89, 0xBC, 0x39, 0xBA, 0x68, 0x9C, 0x8E, 0x2F, 0x5A, 0xDC, 0x8C, 0xC5, 0xB0, + 0x66, 0xCF, 0xB7, 0xEE, 0x5E, 0xEC, 0xFB, 0x11, 0xB6, 0x93, 0x98, 0x59, 0x28, 0x2B, 0x77, 0xF2, + 0xC5, 0x94, 0xEA, 0x36, 0xE4, 0x6A, 0xEB, 0x4B, 0x6A, 0xDF, 0x83, 0x80, 0x28, 0x96, 0x52, 0xB5, + 0xDC, 0x63, 0x64, 0x17, 0x05, 0x77, 0x70, 0x5B, 0xC3, 0x9E, 0xDD, 0x6B, 0x84, 0xF2, 0xDE, 0xAF, + 0x1E, 0x56, 0x83, 0x88, 0x88, 0xAB, 0xD2, 0x2F, 0x53, 0x8F, 0x49, 0xE2, 0x2A, 0x12, 0xBD, 0xFB, + 0x68, 0x42, 0x77, 0x07, 0x96, 0xF4, 0x64, 0x5A, 0xB0, 0xBE, 0xF3, 0x80, 0x4E, 0xDF, 0x10, 0x91, + 0x26, 0x17, 0x69, 0xBD, 0xB4, 0x71, 0x91, 0xDD, 0x31, 0xDF, 0x83, 0xA4, 0xAC, 0x38, 0x69, 0x1C, + 0x88, 0x77, 0x66, 0x3D, 0xEE, 0x13, 0x75, 0x5A, 0xCC, 0x98, 0x8D, 0x59, 0x53, 0xB9, 0x9B, 0xC9, + 0x04, 0x9C, 0xF8, 0x7B, 0x6C, 0xEB, 0x1C, 0x0E, 0x90, 0x21, 0xC5, 0x9C, 0x1B, 0xF8, 0x5B, 0x85, + 0xD8, 0xC8, 0xB6, 0xC3, 0x9D, 0x57, 0x8A, 0x36, 0xF4, 0x6B, 0xA3, 0x0C, 0xD3, 0xF5, 0x0F, 0x21, + 0x4C, 0x24, 0x23, 0xB6, 0x0B, 0x6B, 0x30, 0x95, 0xEA, 0x0C, 0x15, 0xD3, 0x53, 0xF1, 0xA3, 0x50, + 0x19, 0x21, 0x90, 0xF5, 0xD4, 0x10, 0xDE, 0xBE, 0x7F, 0x33, 0x1D, 0xF1, 0x9F, 0x8C, 0xCE, 0x23, + 0x7C, 0x65, 0x5B, 0x6B, 0x6F, 0x04, 0x05, 0xDA, 0x00, 0x5C, 0xF3, 0x33, 0x67, 0xE7, 0xD1, 0xC6, + 0x59, 0x3F, 0xBC, 0x2D, 0x5D, 0x38, 0x09, 0x0D, 0x1E, 0xFC, 0xED, 0xF8, 0x5A, 0xB3, 0xA8, 0x96, + 0x9C, 0xC4, 0x27, 0x31, 0xA8, 0x23, 0x29, 0x80, 0xA8, 0xF0, 0x5A, 0x0B, 0x28, 0x18, 0x43, 0x04, + 0x0E, 0x34, 0x57, 0x83, 0x57, 0x11, 0x94, 0xE9, 0x7D, 0xF7, 0x0A, 0xB1, 0x12, 0xFE, 0x2B, 0xD3, + 0x33, 0xED, 0xEA, 0x80, 0xDA, 0x40, 0x10, 0x3F, 0x18, 0x96, 0x23, 0x89, 0x64, 0xCB, 0x23, 0xD3, + 0x30, 0x57, 0x1B, 0x98, 0x41, 0x21, 0xD7, 0x4A, 0x50, 0x82, 0x09, 0x5B, 0xA1, 0x1D, 0x12, 0x4F, + 0xBD, 0x8A, 0x58, 0x35, 0x4F, 0x36, 0x63, 0x33, 0x11, 0xC3, 0x09, 0xE4, 0xAD, 0x74, 0x3C, 0x52, + 0x45, 0x86, 0x90, 0xE7, 0x2D, 0x60, 0x64, 0x89, 0xB2, 0xAA, 0x67, 0x6F, 0xAE, 0xF3, 0x05, 0x95, + 0xD9, 0x9F, 0x99, 0x54, 0x04, 0x91, 0xE3, 0x92, 0x1B, 0x09, 0x9E, 0x02, 0xC6, 0x11, 0xE2, 0x74, + 0x0A, 0xF8, 0x7F, 0x3F, 0xB7, 0x8D, 0xEC, 0xBC, 0x08, 0x2A, 0x08, 0x71, 0x2F, 0x86, 0x58, 0xB4, + 0xC3, 0x7D, 0xB1, 0x3D, 0x9E, 0xFA, 0xE2, 0xED, 0x38, 0x80, 0xAC, 0x80, 0xD5, 0x24, 0xCC, 0xCB, + 0x69, 0xAA, 0x64, 0x92, 0xAD, 0xC2, 0x77, 0x97, 0xD2, 0x5E, 0x4D, 0xCB, 0x94, 0x6F, 0xC3, 0xCE, + 0xF6, 0x0F, 0x11, 0x63, 0xC3, 0x44, 0xAF, 0xA7, 0xCA, 0x73, 0x94, 0x6D, 0xCC, 0x38, 0xD2, 0x63, + 0x21, 0xB7, 0xC4, 0x31, 0xFD, 0xE5, 0xD0, 0x0E, 0x4B, 0x39, 0x60, 0x17, 0x61, 0xBA, 0x44, 0xFB, + 0x34, 0xB4, 0x3C, 0x5E, 0x01, 0xAE, 0xB3, 0x4E, 0x49, 0xBA, 0x19, 0x2A, 0x31, 0x9D, 0x5A, 0xB1, + 0xC1, 0xF6, 0x72, 0x9F, 0x1C, 0x6B, 0xB1, 0x5A, 0x49, 0x28, 0xFD, 0x72, 0x58, 0xC5, 0x04, 0x20, + 0x31, 0xD3, 0x53, 0xB2, 0x97, 0x89, 0x00, 0xB7, 0x80, 0xE3, 0x51, 0x61, 0xEA, 0xF9, 0xBD, 0x9F, + 0x98, 0xEE, 0xB7, 0xA2, 0x8D, 0x04, 0xA3, 0x89, 0xAF, 0xCC, 0x5F, 0x55, 0x93, 0x54, 0x29, 0xAA, + 0x24, 0xF0, 0xCD, 0x54, 0x95, 0x34, 0xF6, 0x6C, 0x26, 0x91, 0xD3, 0x83, 0x78, 0xB1, 0x6E, 0x24, + 0x23, 0x68, 0xEF, 0x67, 0xB2, 0x28, 0xEC, 0xE0, 0x6C, 0x62, 0x31, 0xDA, 0xEF, 0x81, 0xC0, 0xDF, + 0xEF, 0x52, 0x01, 0x21, 0x0E, 0xCE, 0x85, 0x32, 0x61, 0xB6, 0x7C, 0xB3, 0x41, 0xBB, 0x59, 0x54, + 0x68, 0x93, 0xAA, 0x3B, 0xC7, 0x75, 0x17, 0xCE, 0x9F, 0x2A, 0x10, 0xE9, 0x68, 0x67, 0x91, 0x96, + 0x11, 0x2F, 0x32, 0xF3, 0x8E, 0x1E, 0xF6, 0xF6, 0x4F, 0x3B, 0xA0, 0xAA, 0x48, 0xD4, 0x7A, 0x40, + 0xB4, 0xEA, 0x6D, 0xE6, 0xE1, 0x33, 0x12, 0xAB, 0x41, 0xC0, 0x13, 0x20, 0x8C, 0xB4, 0xBF, 0x21, + 0xF4, 0x0D, 0x30, 0x2C, 0x04, 0x7B, 0x3A, 0x42, 0x5E, 0x60, 0x6A, 0x1C, 0x09, 0x51, 0x78, 0xAE, + 0x98, 0x58, 0x2B, 0x64, 0x77, 0x93, 0x85, 0x8D, 0x09, 0xCD, 0x53, 0xA7, 0xBF, 0x00, 0x8F, 0x27, + 0x05, 0x39, 0xA2, 0xE8, 0x98, 0xCD, 0x81, 0x06, 0x6C, 0x86, 0xBB, 0x71, 0x0D, 0xC3, 0x11, 0x8B, + 0x6F, 0x7B, 0x88, 0x06, 0xE1, 0xA1, 0xD4, 0x3A, 0x20, 0xF2, 0x88, 0x0A, 0x83, 0xA0, 0xAB, 0x44, + 0x74, 0x96, 0xFC, 0x6A, 0x3E, 0xDA, 0xE7, 0x5D, 0x71, 0xA6, 0x42, 0x86, 0x67, 0xAA, 0x70, 0xCE, + 0x84, 0xC6, 0x2F, 0x15, 0x0D, 0x2E, 0x8C, 0xDA, 0x1E, 0xB5, 0x1F, 0x6C, 0x1D, 0x7E, 0x36, 0x32, + 0x75, 0x7C, 0xA8, 0x48, 0xEA, 0x04, 0x1F, 0x6E, 0x88, 0x98, 0xF1, 0x70, 0xB5, 0x4E, 0xDD, 0x42, + 0x29, 0x8D, 0x6D, 0xC0, 0x2A, 0x35, 0x13, 0xB0, 0x29, 0xB2, 0x3F, 0x0A, 0x91, 0xF4, 0xB0, 0x3D, + 0x5E, 0x60, 0x71, 0xD2, 0x88, 0x75, 0x0A, 0x87, 0x35, 0x50, 0xF5, 0xB2, 0x6E, 0xCB, 0x9D, 0x8E, + 0xB9, 0x80, 0xA3, 0x62, 0x32, 0xA8, 0x11, 0x81, 0x7C, 0x4E, 0xFD, 0xE4, 0x5B, 0x82, 0xAD, 0x12, + 0xEC, 0xC2, 0xA0, 0xE0, 0xDF, 0x0D, 0x78, 0x37, 0x20, 0x83, 0x65, 0xC7, 0x0A, 0xF0, 0x28, 0xC4, + 0x5D, 0x95, 0x1B, 0xE1, 0xE3, 0x09, 0x17, 0x49, 0xD0, 0x93, 0x04, 0xFB, 0x5C, 0x52, 0xA7, 0x13, + 0x25, 0x5D, 0x1D, 0xDB, 0xA3, 0x9C, 0xFA, 0x0B, 0x91, 0x37, 0xD4, 0xCA, 0x3F, 0xB9, 0x2A, 0x78, + 0x86, 0xCC, 0x5E, 0x60, 0xD6, 0x90, 0xD3, 0x7B, 0xE4, 0x02, 0x78, 0x8C, 0x06, 0x40, 0xC9, 0xBB, + 0x5B, 0x67, 0x41, 0x5A, 0x1C, 0x9B, 0x18, 0x79, 0xDE, 0x6C, 0x63, 0x13, 0xE8, 0xEB, 0x86, 0x64, + 0x89, 0xEF, 0xDA, 0x8C, 0x87, 0xBB, 0xF0, 0xEF, 0x1A, 0x85, 0x77, 0x79, 0x57, 0x08, 0x70, 0xF9, + 0x09, 0x4E, 0x1C, 0x2E, 0x63, 0xDD, 0x75, 0x26, 0x6D, 0x12, 0x59, 0x45, 0xDC, 0xBD, 0x8F, 0x65, + 0x42, 0x47, 0x7A, 0x30, 0x78, 0x12, 0x0C, 0x75, 0xE2, 0x12, 0x9C, 0xF2, 0x34, 0xBB, 0x94, 0x04, + 0xFF, 0x65, 0x25, 0xD9, 0x2D, 0x9B, 0x28, 0x95, 0xC3, 0x00, 0x2B, 0xAD, 0x35, 0xAD, 0x22, 0x0F, + 0x1A, 0xBF, 0x30, 0x94, 0x18, 0xF1, 0x6A, 0x5E, 0x57, 0x18, 0x21, 0x35, 0xEC, 0xE8, 0x4A, 0x66, + 0x39, 0x32, 0xDB, 0xD9, 0xF8, 0x4C, 0x94, 0xC2, 0xBC, 0xB6, 0xF4, 0xF6, 0x23, 0x7E, 0xCD, 0x35, + 0xF9, 0x41, 0x34, 0xA6, 0xE7, 0x5D, 0xAD, 0xA7, 0x82, 0xA6, 0x5E, 0xEE, 0xC4, 0x0B, 0x74, 0x59, + 0x64, 0x71, 0x50, 0x9F, 0xD7, 0xB0, 0x0F, 0xD0, 0xE7, 0xA3, 0x73, 0x5A, 0x7E, 0x84, 0xAA, 0x19, + 0x86, 0x91, 0x1E, 0x39, 0x61, 0x31, 0x7F, 0x43, 0xE9, 0x82, 0x8A, 0xEC, 0xDE, 0x00, 0x7D, 0x95, + 0x00, 0x07, 0x41, 0x6D, 0x3C, 0xD2, 0x64, 0xCA, 0xC1, 0xDA, 0x60, 0x33, 0x0B, 0xE0, 0x10, 0xE5, + 0xA5, 0x6C, 0x7F, 0x0F, 0x0B, 0x35, 0x57, 0x7B, 0xBC, 0x95, 0x94, 0xC0, 0xFA, 0x51, 0xF0, 0x4F, + 0xA7, 0x57, 0x62, 0x8E, 0xB8, 0x1A, 0x93, 0x9B, 0x31, 0xAF, 0xEA, 0x32, 0x7C, 0x43, 0x57, 0x8E, + 0xB1, 0x23, 0x43, 0x65, 0x69, 0xE6, 0x4F, 0x63, 0x6C, 0xC8, 0x83, 0x78, 0xF7, 0xB2, 0xF7, 0xB7, + 0xE3, 0xB9, 0x18, 0x9B, 0xCD, 0xF5, 0x4A, 0xF0, 0xD9, 0x8C, 0x33, 0x01, 0x51, 0x7E, 0x1F, 0x48, + 0x36, 0x30, 0x59, 0xE7, 0x67, 0x06, 0x68, 0x9A, 0xA4, 0xE3, 0xDA, 0x14, 0x3E, 0x6D, 0xDB, 0x6A, + 0x21, 0x25, 0xCB, 0x46, 0x39, 0x81, 0x0E, 0xFA, 0x4A, 0x85, 0xB6, 0x8D, 0x84, 0xEF, 0xD5, 0xE8, + 0xFB, 0x7A, 0x86, 0x1A, 0x20, 0x6E, 0x5A, 0x95, 0x26, 0xC4, 0xAD, 0x43, 0x94, 0xF6, 0x87, 0xE9, + 0xC0, 0x27, 0x26, 0xC0, 0x51, 0xA5, 0xFB, 0x26, 0xE0, 0xE8, 0x00, 0xC0, 0xF3, 0x87, 0x17, 0x22, + 0x36, 0x77, 0x7C, 0x24, 0xDC, 0x68, 0x5C, 0x6C, 0x17, 0xAF, 0x24, 0x46, 0xAE, 0x71, 0xA3, 0x7E, + 0x71, 0x14, 0x8D, 0x8D, 0xE6, 0x3D, 0xD1, 0x7D, 0xA3, 0x98, 0x0F, 0xEA, 0x6F, 0xCB, 0x32, 0x00, + 0x48, 0x56, 0x5D, 0x70, 0x9E, 0xCC, 0x0A, 0xF9, 0x09, 0x29, 0x58, 0x14, 0xE7, 0x31, 0xAC, 0x25, + 0xD0, 0x6B, 0x41, 0x75, 0x6B, 0xDD, 0x14, 0xFF, 0x09, 0xB9, 0x65, 0xB3, 0x1C, 0x42, 0x8A, 0x8B, + 0xB9, 0xFF, 0x18, 0xE9, 0x5B, 0x9E, 0xE0, 0x9A, 0x21, 0x8B, 0xDE, 0xD2, 0x20, 0x76, 0x5C, 0x8B, + 0x89, 0x3C, 0x3E, 0x7A, 0x62, 0xFD, 0x3E, 0x25, 0x05, 0xCC, 0x26, 0xC6, 0x60, 0x98, 0x3B, 0x79, + 0x3D, 0xB4, 0x2F, 0x28, 0xD5, 0xC5, 0x37, 0x30, 0x91, 0x70, 0x78, 0x2F, 0xA0, 0x49, 0x86, 0x74, + 0x0C, 0x45, 0xC9, 0xF0, 0x13, 0xBD, 0xF7, 0x2C, 0xC0, 0x85, 0x39, 0xE9, 0xA5, 0xB5, 0x1E, 0x30, + 0x50, 0xAD, 0x7D, 0x68, 0x9C, 0xD6, 0x4B, 0xEC, 0x23, 0x6F, 0xEF, 0xAC, 0x8D, 0xF8, 0x7E, 0xF0, + 0x45, 0x8D, 0xD7, 0x0E, 0xA5, 0x37, 0x9C, 0x1B, 0xE3, 0x08, 0xF8, 0xC9, 0x91, 0x70, 0xEC, 0xE0, + 0xF9, 0xD0, 0x5A, 0xAA, 0x77, 0x20, 0x7F, 0x84, 0xF2, 0xD6, 0x5F, 0x41, 0x08, 0x67, 0x16, 0x9D, + 0x16, 0x62, 0x9F, 0x18, 0x68, 0xF3, 0xB4, 0x24, 0x78, 0x4C, 0x93, 0xB1, 0xFE, 0x09, 0x79, 0x7D, + 0x53, 0xAA, 0x5A, 0xBF, 0xC9, 0x95, 0x41, 0xEF, 0x5D, 0x87, 0x4C, 0xEC, 0x6F, 0x6C, 0x28, 0xD6, + 0xC8, 0x5B, 0xA9, 0x9E, 0x6B, 0x0E, 0x3B, 0x59, 0x5A, 0x94, 0xAC, 0x0B, 0xA7, 0x6E, 0x77, 0x76, + 0x80, 0x4D, 0x15, 0x26, 0x32, 0x74, 0xF6, 0xA7, 0x13, 0x44, 0x78, 0xF0, 0x86, 0x6F, 0xD3, 0x20, + 0xE4, 0x07, 0x53, 0xB9, 0xC5, 0xC5, 0x37, 0x5F, 0xDF, 0x8E, 0x8E, 0x77, 0x47, 0x02, 0xA8, 0x00, + 0xC0, 0x8D, 0x4B, 0x3C, 0x9B, 0xAD, 0x21, 0xD1, 0x82, 0x0D, 0xD6, 0x20, 0x9D, 0xE2, 0x91, 0x7A, + 0xD4, 0xF5, 0x4E, 0x35, 0x1D, 0x71, 0x00, 0xBA, 0x49, 0x89, 0x68, 0xE9, 0x03, 0x55, 0xEB, 0x6C, + 0x89, 0xF8, 0xCA, 0x4A, 0x92, 0xA2, 0xD0, 0xDD, 0x0D, 0x0C, 0x68, 0xC1, 0x8A, 0x44, 0x54, 0x9F, + 0xB3, 0x81, 0x08, 0xCF, 0x58, 0xD4, 0x77, 0x4F, 0xCF, 0xE7, 0x69, 0x07, 0x07, 0x97, 0xB7, 0x8B, + 0xF1, 0xCE, 0x78, 0x9D, 0x49, 0x0D, 0x04, 0x62, 0xD6, 0x0C, 0x15, 0xE0, 0x4C, 0x32, 0x2E, 0x12, + 0x4B, 0x97, 0xE4, 0x67, 0xF9, 0xDA, 0xB1, 0x4A, 0x46, 0x30, 0x88, 0x42, 0xE5, 0xC7, 0xB2, 0x32, + 0xB9, 0x82, 0xA1, 0x4C, 0xD0, 0x8D, 0x87, 0x70, 0xFA, 0x21, 0x6C, 0x6D, 0x14, 0xED, 0x67, 0x92, + 0x1F, 0xAD, 0xB4, 0xF6, 0x07, 0x41, 0x02, 0xEE, 0x9B, 0xEE, 0x19, 0x62, 0x8D, 0xA9, 0x38, 0x70, + 0x3E, 0xE9, 0x23, 0x9D, 0x79, 0x74, 0xC9, 0xC7, 0x5E, 0x7D, 0xF6, 0x4E, 0xDE, 0x0A, 0xD1, 0xF8, + 0x39, 0x20, 0xE0, 0x18, 0xF9, 0x2F, 0xB3, 0x8F, 0x39, 0x57, 0x41, 0x07, 0x8F, 0xA2, 0x88, 0x73, + 0x16, 0xE4, 0xA0, 0x18, 0xEC, 0x71, 0xAD, 0x86, 0xD1, 0xDD, 0x89, 0x3E, 0xF8, 0xEB, 0xE0, 0xD0, + 0x3F, 0x01, 0xA2, 0xEF, 0xD9, 0x4F, 0xB6, 0xD0, 0xE9, 0xAD, 0xB5, 0x79, 0x4C, 0x28, 0x83, 0x7C, + 0x3D, 0xE1, 0x68, 0xC0, 0x1D, 0x3C, 0xBB, 0x85, 0x16, 0x77, 0x34, 0xF4, 0x32, 0x60, 0x7A, 0x82, + 0x1C, 0x08, 0xF2, 0x6B, 0x4A, 0x52, 0x08, 0x32, 0x0C, 0xEA, 0xB3, 0xA6, 0x83, 0x7D, 0xF7, 0xF2, + 0xA9, 0x2A, 0xEA, 0xCD, 0xF5, 0x64, 0xAC, 0x32, 0x57, 0xD4, 0x62, 0xB8, 0x7D, 0x4B, 0x26, 0xE3, + 0x6A, 0x81, 0xE5, 0x93, 0x51, 0x1D, 0xF8, 0x6C, 0xC3, 0x9D, 0x2D, 0xB1, 0xDB, 0xCD, 0x39, 0x99, + 0x09, 0xB8, 0xA7, 0x06, 0x20, 0x64, 0x26, 0xBD, 0x94, 0x4B, 0x79, 0x4A, 0x04, 0x1D, 0x13, 0x0D, + 0x3D, 0x77, 0xAF, 0x6A, 0x13, 0xA9, 0xC1, 0x60, 0xB7, 0x60, 0x46, 0x64, 0x6D, 0x59, 0x15, 0x43, + 0x09, 0x80, 0xFA, 0x62, 0x41, 0x55, 0x30, 0xC5, 0x26, 0xCB, 0x84, 0xC9, 0x62, 0x89, 0x84, 0xCA, + 0xAB, 0x3D, 0x7B, 0x42, 0x95, 0xE6, 0x8F, 0x45, 0xD8, 0xD8, 0x16, 0x22, 0x22, 0xE1, 0xBD, 0x3B, + 0x41, 0xEA, 0x17, 0xF0, 0xBD, 0xCD, 0x31, 0xE9, 0x96, 0x07, 0x2F, 0x60, 0x0C, 0xDA, 0xB5, 0x52, + 0x9B, 0x76, 0x33, 0xF1, 0x4E, 0x07, 0x13, 0x4B, 0x1C, 0xE8, 0xCE, 0xF7, 0xC1, 0xF4, 0x4D, 0x1F, + 0x92, 0x69, 0xE1, 0x27, 0x9F, 0xF8, 0x2F, 0x75, 0x66, 0x34, 0xEA, 0x28, 0xCA, 0xBD, 0x05, 0x74, + 0x3A, 0x18, 0xDC, 0x21, 0xBC, 0x72, 0x5F, 0x71, 0xE3, 0x6D, 0xA5, 0xF4, 0xC6, 0x01, 0x3C, 0xD6, + 0x5C, 0xEF, 0x98, 0x97, 0x08, 0x72, 0x98, 0x4F, 0xD8, 0xB1, 0x87, 0x85, 0xE2, 0xBE, 0x46, 0x2E, + 0x0C, 0x84, 0x83, 0x67, 0xE7, 0x26, 0xD5, 0xC1, 0x38, 0xDD, 0x2E, 0x49, 0x0B, 0xF6, 0x25, 0x87, + 0xD6, 0x32, 0x37, 0x04, 0x27, 0xCD, 0x25, 0x37, 0xF8, 0x16, 0x9E, 0xD6, 0x19, 0xAC, 0xCC, 0x31, + 0xDD, 0xA8, 0xA7, 0x5B, 0x5F, 0x41, 0x76, 0xDE, 0x2A, 0x7B, 0xFD, 0x1D, 0x17, 0x16, 0x3B, 0x5A, + 0x59, 0xA5, 0x0F, 0x1D, 0x4E, 0xC6, 0xC9, 0x62, 0x62, 0xB0, 0xE3, 0x68, 0xB9, 0x47, 0x8F, 0x0D, + 0x4D, 0x90, 0xA6, 0x82, 0xC5, 0x32, 0x4C, 0xD6, 0x3D, 0xAB, 0x05, 0xAF, 0x88, 0xC4, 0x5A, 0x45, + 0xDA, 0x92, 0x5F, 0x75, 0x0C, 0xE9, 0x69, 0x44, 0x90, 0x3D, 0xCB, 0x65, 0x4A, 0x58, 0x67, 0x8A, + 0xD8, 0x91, 0x15, 0x47, 0xE3, 0xD4, 0xC9, 0xC4, 0x07, 0x4B, 0x39, 0x77, 0x2B, 0x84, 0xE7, 0xF7, + 0x76, 0xBB, 0x28, 0x9F, 0x90, 0x86, 0xFF, 0x0E, 0x47, 0x4B, 0x25, 0x21, 0x5D, 0x32, 0xCB, 0x0A, + 0x04, 0x7E, 0x89, 0x9D, 0x2A, 0x27, 0x31, 0xDD, 0x74, 0x39, 0x3F, 0x8C, 0x36, 0xF3, 0x6E, 0x68, + 0xCA, 0xB2, 0x1A, 0x38, 0x7C, 0x28, 0xC6, 0xAA, 0xE5, 0x1C, 0xBA, 0x91, 0x67, 0x2A, 0x87, 0xB2, + 0x34, 0xDB, 0xF5, 0x79, 0x9A, 0x19, 0x3A, 0xB1, 0x2B, 0x74, 0x27, 0x0B, 0xB7, 0x3D, 0x09, 0x6B, + 0x74, 0x61, 0x9E, 0xD7, 0x60, 0x30, 0x2C, 0x19, 0xFA, 0xD9, 0x4F, 0x5E, 0x73, 0xA4, 0xD0, 0x5E, + 0x00, 0xB3, 0x99, 0x2B, 0x1C, 0x6A, 0x76, 0x09, 0x0E, 0xDF, 0x98, 0x3F, 0x86, 0x6C, 0x28, 0xBB, + 0x78, 0x75, 0x51, 0x23, 0x9E, 0x94, 0x6C, 0x48, 0x32, 0x50, 0xD0, 0x3A, 0xF2, 0xA7, 0x1D, 0xC8, + 0x5E, 0xF9, 0xA1, 0xEE, 0x1E, 0xCA, 0xF0, 0x01, 0x38, 0xB8, 0xEE, 0x2B, 0x45, 0x8C, 0x48, 0x60, + 0xD5, 0x3B, 0xD0, 0x80, 0xF6, 0x59, 0x5A, 0xE4, 0x58, 0xBC, 0x4A, 0x37, 0x0C, 0xA0, 0x7F, 0x68, + 0xC2, 0x03, 0x4C, 0x10, 0xBE, 0x0D, 0xE6, 0x6D, 0x2A, 0x2B, 0x2E, 0xF9, 0xD4, 0xBD, 0xB3, 0x22, + 0xF4, 0xC3, 0xF4, 0xDF, 0x67, 0xEF, 0xA5, 0x40, 0x6A, 0x6A, 0x43, 0xFE, 0x23, 0xCF, 0x02, 0x29, + 0x04, 0x3C, 0x5F, 0x59, 0xCC, 0x2A, 0x4B, 0xCF, 0x23, 0x53, 0x65, 0x70, 0xE3, 0xAD, 0x43, 0xE7, + 0x69, 0x61, 0x9E, 0x23, 0x92, 0x83, 0x0D, 0x88, 0xF3, 0x21, 0xCD, 0x1C, 0x5B, 0xB1, 0xBB, 0x08, + 0x6E, 0xD7, 0x61, 0x52, 0x59, 0xBD, 0x35, 0x2E, 0xB6, 0x21, 0xC6, 0x7B, 0xA1, 0xE5, 0xC1, 0x20, + 0x97, 0x88, 0x61, 0x50, 0x94, 0x9F, 0x6F, 0xF0, 0x26, 0x64, 0x11, 0xE0, 0x07, 0xAD, 0x94, 0x4B, + 0xAD, 0x56, 0x08, 0x4C, 0x78, 0x96, 0xB6, 0x79, 0x4E, 0x9B, 0xE0, 0x6F, 0x3E, 0xFE, 0x71, 0x0A, + 0x42, 0x26, 0xA7, 0xAC, 0x93, 0xAE, 0xD8, 0xBF, 0x15, 0x6F, 0x7D, 0x30, 0xEF, 0x31, 0xA7, 0x52, + 0x90, 0xDB, 0x63, 0xDE, 0xAB, 0x4E, 0x6F, 0x74, 0x2A, 0xC6, 0x6E, 0xE3, 0x64, 0xD0, 0x9E, 0x59, + 0x94, 0x6D, 0x72, 0x52, 0x15, 0x85, 0x71, 0x23, 0xE3, 0xBF, 0xB6, 0xCF, 0x69, 0x31, 0xEB, 0x52, + 0xD5, 0xE4, 0x62, 0x74, 0xFA, 0x4D, 0xAC, 0x88, 0xE8, 0x7E, 0xAA, 0xC1, 0x80, 0x75, 0x27, 0x3F, + 0x0C, 0x92, 0xED, 0x0B, 0xA8, 0xE6, 0xE0, 0xA6, 0x1E, 0x0C, 0xE6, 0xA6, 0x81, 0x5C, 0x76, 0xE8, + 0xBA, 0xEF, 0xD5, 0x28, 0x59, 0xA1, 0x91, 0x2B, 0x97, 0xF4, 0x6A, 0xCB, 0xA1, 0x28, 0x12, 0xED, + 0xD0, 0x02, 0xAC, 0xC2, 0x96, 0x5F, 0xA0, 0xD7, 0x89, 0x6C, 0x40, 0xF5, 0x29, 0xC5, 0xAD, 0x98, + 0x06, 0xF8, 0x33, 0x53, 0x3A, 0x5C, 0x2D, 0xEC, 0xE1, 0x05, 0x63, 0xA8, 0x20, 0xD5, 0x16, 0xA3, + 0x52, 0x26, 0x4E, 0x39, 0xA8, 0xDB, 0x66, 0xA4, 0x09, 0x29, 0xA2, 0xE4, 0x39, 0x59, 0xD6, 0x59, + 0x0D, 0xE9, 0xD5, 0x5C, 0x96, 0x15, 0x59, 0x2C, 0xE5, 0xC9, 0x55, 0xDE, 0x01, 0xF6, 0x41, 0xB9, + 0x57, 0x9F, 0x72, 0x06, 0xD5, 0x61, 0x70, 0xDE, 0x71, 0x58, 0xE8, 0xCA, 0x87, 0xA7, 0x49, 0x50, + 0xDE, 0x74, 0x6A, 0x42, 0x71, 0xFE, 0x41, 0x19, 0xB4, 0x84, 0x5F, 0xD4, 0xA5, 0xE9, 0x23, 0xFB, + 0x79, 0x42, 0x37, 0x03, 0xFA, 0x36, 0x19, 0x6D, 0x9A, 0x79, 0x0A, 0x65, 0xE8, 0xFE, 0x21, 0x22, + 0xF8, 0xA3, 0x82, 0x5A, 0x8C, 0xA3, 0x43, 0x5B, 0x39, 0x26, 0x1F, 0xC2, 0x1A, 0xD4, 0x89, 0xD4, + 0xF1, 0x21, 0x69, 0x97, 0x15, 0xA9, 0xF2, 0x56, 0x8F, 0xD0, 0x95, 0x77, 0x73, 0xA5, 0xD6, 0x73, + 0x11, 0xC7, 0x60, 0x8B, 0xAE, 0x0C, 0x34, 0xE6, 0x24, 0x76, 0xCD, 0x9D, 0x0A, 0x08, 0xB7, 0xB6, + 0x1B, 0xBC, 0x32, 0x3E, 0x1E, 0xA0, 0x67, 0x19, 0xB9, 0x42, 0x86, 0x10, 0xCB, 0x74, 0xBC, 0x5B, + 0xDE, 0x69, 0xCA, 0xEB, 0x76, 0x7F, 0x78, 0x1C, 0x99, 0x44, 0x95, 0x4E, 0x83, 0x4F, 0x41, 0x5B, + 0x8F, 0xB2, 0xBE, 0x9E, 0x9E, 0xE3, 0xC0, 0xDC, 0x1C, 0xAC, 0x19, 0x32, 0x32, 0x6F, 0x86, 0x79, + 0x53, 0x51, 0x0B, 0x98, 0x5E, 0x2C, 0xF3, 0x71, 0x4C, 0x48, 0xBA, 0xF5, 0x6B, 0x00, 0x80, 0x8D, + 0xD6, 0xFE, 0xE1, 0xEA, 0xD7, 0x72, 0xA9, 0x58, 0x5B, 0x8C, 0x71, 0xA0, 0x21, 0xBB, 0xC7, 0x55, + 0x8A, 0xCF, 0x2E, 0x5F, 0x8A, 0x13, 0x86, 0x9F, 0x22, 0x74, 0x66, 0x6E, 0xDC, 0x9B, 0xE4, 0x06, + 0x4F, 0x9E, 0x52, 0xFE, 0x3A, 0xD2, 0x86, 0x97, 0x63, 0x68, 0xD6, 0x16, 0x15, 0xED, 0x86, 0xE3, + 0x2C, 0x49, 0x6F, 0x21, 0x20, 0xBA, 0xF3, 0xA8, 0xE7, 0xBF, 0xEF, 0x5C, 0x11, 0x08, 0xAF, 0xD0, + 0x99, 0xDB, 0xC0, 0xEF, 0xB1, 0x6A, 0xB6, 0x60, 0x05, 0x58, 0xFD, 0x8E, 0x56, 0x1D, 0xB8, 0x8B, + 0xC6, 0x3F, 0xB0, 0xAE, 0x5E, 0x6B, 0xEA, 0x8F, 0x29, 0x73, 0xBA, 0x49, 0xE3, 0x93, 0x1C, 0x52, + 0x3B, 0x07, 0xAB, 0xF8, 0x44, 0x8B, 0xB7, 0xAF, 0xB4, 0x34, 0xA4, 0xA3, 0x6F, 0x66, 0xD4, 0xA1, + 0x94, 0x58, 0x13, 0x7B, 0xE0, 0x42, 0x7F, 0x87, 0xC1, 0xE0, 0x41, 0xF3, 0xE4, 0x91, 0xFE, 0x69, + 0xD6, 0x97, 0xEE, 0x61, 0xA3, 0xBB, 0x1B, 0xA5, 0xA3, 0x20, 0xB3, 0xD3, 0x09, 0x00, 0xBD, 0x50, + 0xDE, 0xC4, 0x93, 0x1C, 0x7D, 0x7D, 0xB8, 0x1A, 0xD1, 0x44, 0x2A, 0x31, 0x3F, 0x2C, 0x8A, 0xAC, + 0x59, 0x34, 0x2D, 0x8C, 0xE4, 0x33, 0x50, 0xD2, 0x53, 0x5D, 0x2F, 0x3B, 0xE0, 0x59, 0x12, 0xE8, + 0x95, 0xDE, 0x06, 0x38, 0x52, 0x37, 0xB8, 0x1E, 0xF3, 0xC2, 0x64, 0x5B, 0x23, 0x31, 0x6B, 0x8A, + 0x5A, 0x80, 0xCE, 0x36, 0xB7, 0xBE, 0x2D, 0x2D, 0x4B, 0x31, 0x03, 0x29, 0xB5, 0x68, 0x05, 0x4B, + 0x3B, 0xDE, 0x07, 0xBA, 0xC3, 0xE3, 0xF9, 0x35, 0x1A, 0xDE, 0x4B, 0xB3, 0x86, 0x8A, 0x5C, 0x23, + 0xA7, 0xC6, 0x2D, 0xE0, 0x01, 0x1E, 0x00, 0x6A, 0xC0, 0xF0, 0x9E, 0x20, 0x47, 0xA0, 0xF1, 0x2F, + 0xEF, 0x3F, 0x3F, 0xD0, 0x2C, 0x92, 0x3A, 0x05, 0x07, 0x6B, 0x45, 0x73, 0x80, 0x45, 0x2A, 0xC6, + 0x4C, 0xE8, 0x98, 0x51, 0x33, 0xE6, 0x5B, 0x90, 0xFC, 0x4A, 0xD2, 0x35, 0x0C, 0x57, 0x02, 0xDE, + 0x61, 0x00, 0xCE, 0xE1, 0x73, 0xA6, 0x94, 0xF7, 0x9B, 0x0B, 0xB9, 0xA3, 0x5E, 0xE0, 0xF1, 0x54, + 0x36, 0x28, 0xE6, 0xD6, 0x2E, 0xE1, 0x1C, 0x85, 0x23, 0x36, 0x7E, 0x5C, 0x48, 0xB1, 0x95, 0xA1, + 0x33, 0x8A, 0x2E, 0x06, 0xBC, 0xAC, 0x7F, 0x08, 0xB8, 0x6D, 0xE9, 0x23, 0xF5, 0x77, 0x6D, 0xB5, + 0x8E, 0x35, 0x9B, 0x4B, 0xC9, 0x6E, 0xE2, 0x69, 0xEA, 0x72, 0x04, 0xA5, 0x9C, 0x13, 0x28, 0xB7, + 0x7D, 0x8A, 0x40, 0xC1, 0xDE, 0x03, 0xBF, 0x75, 0x7B, 0xBA, 0x46, 0x64, 0x2E, 0xA3, 0x1F, 0x1D, + 0x51, 0xD7, 0x96, 0xA8, 0xC4, 0xFC, 0x28, 0xCD, 0x09, 0xD2, 0xB4, 0x37, 0x42, 0x0B, 0xB3, 0x7C, + 0x2E, 0xA1, 0xFA, 0x20, 0x16, 0xF1, 0xF2, 0x70, 0xE6, 0x90, 0x25, 0xDB, 0xE5, 0x01, 0xD5, 0x45, + 0xC4, 0x43, 0x50, 0x49, 0xDC, 0xF0, 0xA2, 0x39, 0x4F, 0x9D, 0x0E, 0xC1, 0x66, 0x78, 0x14, 0x2A, + 0xA3, 0x82, 0xA8, 0x1E, 0x9E, 0x29, 0x8F, 0x03, 0xD6, 0xBC, 0x3C, 0xB8, 0x5B, 0xD1, 0xC2, 0x4B, + 0x82, 0xD2, 0x34, 0x37, 0x33, 0x5C, 0x89, 0x8B, 0x00, 0x3B, 0x5F, 0xD7, 0xEB, 0x02, 0x98, 0x46, + 0xBC, 0x47, 0xF3, 0xEB, 0xFA, 0xC5, 0x6F, 0x2E, 0x99, 0x65, 0x59, 0x8D, 0x0A, 0xC8, 0x7E, 0xC5, + 0x11, 0x71, 0x9F, 0x04, 0xE1, 0xB2, 0x92, 0xAE, 0xCA, 0xCB, 0x6C, 0xF1, 0x0A, 0xBF, 0x76, 0x24, + 0x1C, 0xA1, 0xEC, 0x91, 0xE9, 0xEC, 0xFD, 0x44, 0xE1, 0x47, 0x2C, 0xC0, 0xC9, 0xEC, 0x35, 0x1A, + 0x8A, 0xF5, 0x9C, 0x24, 0xF2, 0x5B, 0x7A, 0x27, 0x0C, 0x85, 0x02, 0xFB, 0x65, 0xF0, 0x14, 0xA4, + 0x51, 0x5B, 0xD9, 0xB2, 0xAC, 0xC6, 0x21, 0x02, 0xFA, 0x2B, 0x28, 0x7A, 0x54, 0xC5, 0x69, 0xFD, + 0x7F, 0x62, 0xD2, 0x64, 0x07, 0x65, 0x0C, 0xAF, 0xC4, 0xD8, 0x3F, 0xD0, 0xCC, 0x65, 0x5F, 0x7D, + 0x67, 0xFC, 0x14, 0xFA, 0x1F, 0x76, 0xDD, 0x0E, 0xEE, 0xB9, 0xCA, 0x97, 0xEE, 0x8B, 0xCB, 0xA1, + 0xA0, 0x26, 0x00, 0x46, 0x11, 0xAE, 0x00, 0xA4, 0x7B, 0xB7, 0xFE, 0x66, 0xCA, 0x0A, 0x81, 0x06, + 0x91, 0x19, 0x0E, 0x8C, 0x96, 0x0A, 0x50, 0x7F, 0xA2, 0x1E, 0x31, 0x50, 0x4C, 0x1D, 0x92, 0xD4, + 0xC5, 0x17, 0x50, 0x21, 0xEB, 0xA9, 0x1E, 0x87, 0x16, 0x85, 0xBD, 0xC5, 0x47, 0x9F, 0xE8, 0xEA, + 0x92, 0xBB, 0x33, 0x68, 0xE7, 0x2F, 0xC6, 0x6A, 0x6F, 0x42, 0xB9, 0x69, 0x83, 0x97, 0xE7, 0xC8, + 0x56, 0x05, 0x6F, 0x35, 0xF6, 0x03, 0x86, 0x61, 0x0C, 0xEB, 0xD4, 0x8C, 0x8B, 0x52, 0x0A, 0x8C, + 0xD0, 0x92, 0x18, 0x69, 0x94, 0x19, 0x1E, 0x1A, 0xE6, 0x28, 0x9E, 0x46, 0x1D, 0x93, 0x95, 0xF7, + 0xF5, 0x87, 0xB1, 0xE3, 0x5B, 0x8B, 0x02, 0xB3, 0x34, 0x48, 0xCE, 0xAA, 0xBC, 0x1F, 0x9C, 0x80, + 0x06, 0x6F, 0xB9, 0xB7, 0x03, 0x4B, 0x9F, 0xA1, 0x71, 0x91, 0xAA, 0x43, 0x39, 0x62, 0x87, 0xCB, + 0x68, 0xBD, 0x9C, 0xD0, 0x32, 0x88, 0x5C, 0x7E, 0x6E, 0x6A, 0x39, 0x95, 0x37, 0x19, 0x40, 0x38, + 0x00, 0x41, 0x08, 0xA2, 0x33, 0xBD, 0x30, 0xC0 +}; + diff --git a/src/decimal-pi.txt b/src/decimal-pi.txt new file mode 100644 index 00000000..58d8f3b6 --- /dev/null +++ b/src/decimal-pi.txt @@ -0,0 +1 @@ +3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632788659361533818279682303019520353018529689957736225994138912497217752834791315155748572424541506959508295331168617278558890750983817546374649393192550604009277016711390098488240128583616035637076601047101819429555961989467678374494482553797747268471040475346462080466842590694912933136770289891521047521620569660240580381501935112533824300355876402474964732639141992726042699227967823547816360093417216412199245863150302861829745557067498385054945885869269956909272107975093029553211653449872027559602364806654991198818347977535663698074265425278625518184175746728909777727938000816470600161452491921732172147723501414419735685481613611573525521334757418494684385233239073941433345477624168625189835694855620992192221842725502542568876717904946016534668049886272327917860857843838279679766814541009538837863609506800642251252051173929848960841284886269456042419652850222106611863067442786220391949450471237137869609563643719172874677646575739624138908658326459958133904780275900994657640789512694683983525957098258226205224894077267194782684826014769909026401363944374553050682034962524517493996514314298091906592509372216964615157098583874105978859597729754989301617539284681382686838689427741559918559252459539594310499725246808459872736446958486538367362226260991246080512438843904512441365497627807977156914359977001296160894416948685558484063534220722258284886481584560285060168427394522674676788952521385225499546667278239864565961163548862305774564980355936345681743241125150760694794510965960940252288797108931456691368672287489405601015033086179286809208747609178249385890097149096759852613655497818931297848216829989487226588048575640142704775551323796414515237462343645428584447952658678210511413547357395231134271661021359695362314429524849371871101457654035902799344037420073105785390621983874478084784896833214457138687519435064302184531910484810053706146806749192781911979399520614196634287544406437451237181921799983910159195618146751426912397489409071864942319615679452080951465502252316038819301420937621378559566389377870830390697920773467221825625996615014215030680384477345492026054146659252014974428507325186660021324340881907104863317346496514539057962685610055081066587969981635747363840525714591028970641401109712062804390397595156771577004203378699360072305587631763594218731251471205329281918261861258673215791984148488291644706095752706957220917567116722910981690915280173506712748583222871835209353965725121083579151369882091444210067510334671103141267111369908658516398315019701651511685171437657618351556508849099898599823873455283316355076479185358932261854896321329330898570642046752590709154814165498594616371802709819943099244889575712828905923233260972997120844335732654893823911932597463667305836041428138830320382490375898524374417029132765618093773444030707469211201913020330380197621101100449293215160842444859637669838952286847831235526582131449576857262433441893039686426243410773226978028073189154411010446823252716201052652272111660396665573092547110557853763466820653109896526918620564769312570586356620185581007293606598764861179104533488503461136576867532494416680396265797877185560845529654126654085306143444318586769751456614068007002378776591344017127494704205622305389945613140711270004078547332699390814546646458807972708266830634328587856983052358089330657574067954571637752542021149557615814002501262285941302164715509792592309907965473761255176567513575178296664547791745011299614890304639947132962107340437518957359614589019389713111790429782856475032031986915140287080859904801094121472213179476477726224142548545403321571853061422881375850430633217518297986622371721591607716692547487389866549494501146540628433663937900397692656721463853067360965712091807638327166416274888800786925602902284721040317211860820419000422966171196377921337575114959501566049631862947265473642523081770367515906735023507283540567040386743513622224771589150495309844489333096340878076932599397805419341447377441842631298608099888687413260472156951623965864573021631598193195167353812974167729478672422924654366800980676928238280689964004824354037014163149658979409243237896907069779422362508221688957383798623001593776471651228935786015881617557829735233446042815126272037343146531977774160319906655418763979293344195215413418994854447345673831624993419131814809277771038638773431772075456545322077709212019051660962804909263601975988281613323166636528619326686336062735676303544776280350450777235547105859548702790814356240145171806246436267945612753181340783303362542327839449753824372058353114771199260638133467768796959703098339130771098704085913374641442822772634659470474587847787201927715280731767907707157213444730605700733492436931138350493163128404251219256517980694113528013147013047816437885185290928545201165839341965621349143415956258658655705526904965209858033850722426482939728584783163057777560688876446248246857926039535277348030480290058760758251047470916439613626760449256274204208320856611906254543372131535958450687724602901618766795240616342522577195429162991930645537799140373404328752628889639958794757291746426357455254079091451357111369410911939325191076020825202618798531887705842972591677813149699009019211697173727847684726860849003377024242916513005005168323364350389517029893922334517220138128069650117844087451960121228599371623130171144484640903890644954440061986907548516026327505298349187407866808818338510228334508504860825039302133219715518430635455007668282949304137765527939751754613953984683393638304746119966538581538420568533862186725233402830871123282789212507712629463229563989898935821167456270102183564622013496715188190973038119800497340723961036854066431939509790190699639552453005450580685501956730229219139339185680344903982059551002263535361920419947455385938102343955449597783779023742161727111723643435439478221818528624085140066604433258885698670543154706965747458550332323342107301545940516553790686627333799585115625784322988273723198987571415957811196358330059408730681216028764962867446047746491599505497374256269010490377819868359381465741268049256487985561453723478673303904688383436346553794986419270563872931748723320837601123029911367938627089438799362016295154133714248928307220126901475466847653576164773794675200490757155527819653621323926406160136358155907422020203187277605277219005561484255518792530343513984425322341576233610642506390497500865627109535919465897514131034822769306247435363256916078154781811528436679570611086153315044521274739245449454236828860613408414863776700961207151249140430272538607648236341433462351897576645216413767969031495019108575984423919862916421939949072362346468441173940326591840443780513338945257423995082965912285085558215725031071257012668302402929525220118726767562204154205161841634847565169998116141010029960783869092916030288400269104140792886215078424516709087000699282120660418371806535567252532567532861291042487761825829765157959847035622262934860034158722980534989650226291748788202734209222245339856264766914905562842503912757710284027998066365825488926488025456610172967026640765590429099456815065265305371829412703369313785178609040708667114965583434347693385781711386455873678123014587687126603489139095620099393610310291616152881384379099042317473363948045759314931405297634757481193567091101377517210080315590248530906692037671922033229094334676851422144773793937517034436619910403375111735471918550464490263655128162288244625759163330391072253837421821408835086573917715096828874782656995995744906617583441375223970968340800535598491754173818839994469748676265516582765848358845314277568790029095170283529716344562129640435231176006651012412006597558512761785838292041974844236080071930457618932349229279650198751872127267507981255470958904556357921221033346697499235630254947802490114195212382815309114079073860251522742995818072471625916685451333123948049470791191532673430282441860414263639548000448002670496248201792896476697583183271314251702969234889627668440323260927524960357996469256504936818360900323809293459588970695365349406034021665443755890045632882250545255640564482465151875471196218443965825337543885690941130315095261793780029741207665147939425902989695946995565761218656196733786236256125216320862869222103274889218654364802296780705765615144632046927906821207388377814233562823608963208068222468012248261177185896381409183903673672220888321513755600372798394004152970028783076670944474560134556417254370906979396122571429894671543578468788614445812314593571984922528471605049221242470141214780573455105008019086996033027634787081081754501193071412233908663938339529425786905076431006383519834389341596131854347546495569781038293097164651438407007073604112373599843452251610507027056235266012764848308407611830130527932054274628654036036745328651057065874882256981579367897669742205750596834408697350201410206723585020072452256326513410559240190274216248439140359989535394590944070469120914093870012645600162374288021092764579310657922955249887275846101264836999892256959688159205600101655256375678 diff --git a/src/decimal.cc b/src/decimal.cc index 61d18fee..dd5dae3c 100644 --- a/src/decimal.cc +++ b/src/decimal.cc @@ -2013,21 +2013,28 @@ decimal_p decimal::fact(decimal_r x) // // ============================================================================ -void decimal::init_constants() +#include "decimal-pi.h" + +decimal::ccache &decimal::constants() // ---------------------------------------------------------------------------- // Initialize the constants used for adjustments // ---------------------------------------------------------------------------- { -} - - - -decimal_p decimal::pi() -// ---------------------------------------------------------------------------- -// Return a representation of pi as a decimal -// ---------------------------------------------------------------------------- -{ - return nullptr; + static ccache *cst = nullptr; + if (!cst) + { + // operator new support purposefully not linked in embedded versions + cst = (ccache *) malloc(sizeof(ccache)); + new(cst) ccache; + } + size_t precision = Settings.Precision(); + if (cst->precision != precision) + { + size_t nkigs = (precision + 2) / 3; + cst->pi = rt.make(1, nkigs, gcbytes(decimal_pi)); + cst->precision = precision; + } + return *cst; } @@ -2048,8 +2055,9 @@ decimal_p decimal::adjust_from_angle() const decimal_g x = this; decimal_g ratio = rt.make(half_circle); - ratio = ratio / decimal_g(pi()); - return x * ratio; + x = x * ratio; + x = x / pi(); + return x; } @@ -2070,8 +2078,9 @@ decimal_p decimal::adjust_to_angle() const decimal_g x = this; decimal_g ratio = rt.make(half_circle); - ratio = ratio / decimal_g(pi()); - return x / ratio; + x = x / ratio; + x = x * pi(); + return x; } diff --git a/src/decimal.h b/src/decimal.h index 4c831855..aad32cd5 100644 --- a/src/decimal.h +++ b/src/decimal.h @@ -90,6 +90,7 @@ struct decimal : algebraic { byte *p = (byte *) payload(this); p = leb128(p, exp); + p = leb128(p, nkig); memcpy(p, kig.Safe(), (nkig * 10 + 7) / 8); } static size_t required_memory(id type, int exp, size_t n, gcbytes UNUSED) @@ -459,17 +460,31 @@ struct decimal : algebraic static decimal_p fact(decimal_r x); + // ======================================================================== // // Support for math functions // // ======================================================================== - static decimal_p pi(); + struct ccache + // ------------------------------------------------------------------------ + // Constants are re-created whenever precision changes + // ------------------------------------------------------------------------ + { + ccache(): precision() {} + + size_t precision; + decimal_g pi; + }; + + static ccache &constants(); + + + static decimal_p pi() { return constants().pi; } decimal_p adjust_from_angle() const; decimal_p adjust_to_angle() const; static bool adjust_to_angle(algebraic_g &x); - static void init_constants(); public: OBJECT_DECL(decimal); diff --git a/tools/decimize/decimize.cpp b/tools/decimize/decimize.cpp index 2e2d4663..db3cee3b 100644 --- a/tools/decimize/decimize.cpp +++ b/tools/decimize/decimize.cpp @@ -144,7 +144,7 @@ int main(int argc, char **argv) printf("%zu digits, %zu kigits, %zu bytes\n", digits, kigits, bytes); printf("\n"); - printf("unsigned char %s[%zu] =\n{", name, bytes); + printf("static const byte %s[%zu] =\n{", name, bytes); for (size_t b = 0; b < bytes; b++) printf("%s0x%02X%s", b % 16 ? " " : "\n ",