| | @@ -412,21 +412,17 @@ |
| 412 | 412 | ** for file names to treat as binary. If fIncludeBinary is zero, these files |
| 413 | 413 | ** will be skipped in addition to files that may contain binary content. |
| 414 | 414 | */ |
| 415 | 415 | void diff_file( |
| 416 | 416 | Blob *pFile1, /* In memory content to compare from */ |
| 417 | | - int isBin1, /* Does the 'from' content appear to be binary */ |
| 418 | 417 | const char *zFile2, /* On disk content to compare to */ |
| 419 | 418 | const char *zName, /* Display name of the file */ |
| 420 | | - const char *zDiffCmd, /* Command for comparison */ |
| 421 | | - const char *zBinGlob, /* Treat file names matching this as binary */ |
| 422 | | - int fIncludeBinary, /* Include binary files for external diff */ |
| 423 | 419 | DiffConfig *pCfg, /* Flags to control the diff */ |
| 424 | 420 | int fSwapDiff, /* Diff from Zfile2 to Pfile1 */ |
| 425 | 421 | Blob *diffBlob /* Blob to store diff output */ |
| 426 | 422 | ){ |
| 427 | | - if( zDiffCmd==0 ){ |
| 423 | + if( pCfg->zDiffCmd==0 ){ |
| 428 | 424 | Blob out; /* Diff output text */ |
| 429 | 425 | Blob file2; /* Content of zFile2 */ |
| 430 | 426 | const char *zName2; /* Name of zFile2 for display */ |
| 431 | 427 | |
| 432 | 428 | /* Read content of zFile2 into memory */ |
| | @@ -473,18 +469,18 @@ |
| 473 | 469 | blob_reset(&file2); |
| 474 | 470 | }else{ |
| 475 | 471 | Blob nameFile1; /* Name of temporary file to old pFile1 content */ |
| 476 | 472 | Blob cmd; /* Text of command to run */ |
| 477 | 473 | |
| 478 | | - if( !fIncludeBinary ){ |
| 474 | + if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){ |
| 479 | 475 | Blob file2; |
| 480 | | - if( isBin1 ){ |
| 476 | + if( looks_like_binary(pFile1) ){ |
| 481 | 477 | fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY); |
| 482 | 478 | return; |
| 483 | 479 | } |
| 484 | | - if( zBinGlob ){ |
| 485 | | - Glob *pBinary = glob_create(zBinGlob); |
| 480 | + if( pCfg->zBinGlob ){ |
| 481 | + Glob *pBinary = glob_create(pCfg->zBinGlob); |
| 486 | 482 | if( glob_match(pBinary, zName) ){ |
| 487 | 483 | fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY); |
| 488 | 484 | glob_free(pBinary); |
| 489 | 485 | return; |
| 490 | 486 | } |
| | @@ -507,11 +503,11 @@ |
| 507 | 503 | file_tempname(&nameFile1, zFile2, "orig"); |
| 508 | 504 | blob_write_to_file(pFile1, blob_str(&nameFile1)); |
| 509 | 505 | |
| 510 | 506 | /* Construct the external diff command */ |
| 511 | 507 | blob_zero(&cmd); |
| 512 | | - blob_append(&cmd, zDiffCmd, -1); |
| 508 | + blob_append(&cmd, pCfg->zDiffCmd, -1); |
| 513 | 509 | if( fSwapDiff ){ |
| 514 | 510 | blob_append_escaped_arg(&cmd, zFile2, 1); |
| 515 | 511 | blob_append_escaped_arg(&cmd, blob_str(&nameFile1), 1); |
| 516 | 512 | }else{ |
| 517 | 513 | blob_append_escaped_arg(&cmd, blob_str(&nameFile1), 1); |
| | @@ -542,20 +538,15 @@ |
| 542 | 538 | ** will be skipped in addition to files that may contain binary content. |
| 543 | 539 | */ |
| 544 | 540 | void diff_file_mem( |
| 545 | 541 | Blob *pFile1, /* In memory content to compare from */ |
| 546 | 542 | Blob *pFile2, /* In memory content to compare to */ |
| 547 | | - int isBin1, /* Does the 'from' content appear to be binary */ |
| 548 | | - int isBin2, /* Does the 'to' content appear to be binary */ |
| 549 | 543 | const char *zName, /* Display name of the file */ |
| 550 | | - const char *zDiffCmd, /* Command for comparison */ |
| 551 | | - const char *zBinGlob, /* Treat file names matching this as binary */ |
| 552 | | - int fIncludeBinary, /* Include binary files for external diff */ |
| 553 | 544 | DiffConfig *pCfg /* Diff flags */ |
| 554 | 545 | ){ |
| 555 | 546 | if( pCfg->diffFlags & DIFF_BRIEF ) return; |
| 556 | | - if( zDiffCmd==0 ){ |
| 547 | + if( pCfg->zDiffCmd==0 ){ |
| 557 | 548 | Blob out; /* Diff output text */ |
| 558 | 549 | |
| 559 | 550 | blob_zero(&out); |
| 560 | 551 | text_diff(pFile1, pFile2, &out, pCfg); |
| 561 | 552 | if( pCfg->diffFlags & DIFF_NUMSTAT ){ |
| | @@ -570,17 +561,17 @@ |
| 570 | 561 | }else{ |
| 571 | 562 | Blob cmd; |
| 572 | 563 | Blob temp1; |
| 573 | 564 | Blob temp2; |
| 574 | 565 | |
| 575 | | - if( !fIncludeBinary ){ |
| 576 | | - if( isBin1 || isBin2 ){ |
| 566 | + if( (pCfg->diffFlags & DIFF_INCBINARY)==0 ){ |
| 567 | + if( looks_like_binary(pFile1) || looks_like_binary(pFile2) ){ |
| 577 | 568 | fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY); |
| 578 | 569 | return; |
| 579 | 570 | } |
| 580 | | - if( zBinGlob ){ |
| 581 | | - Glob *pBinary = glob_create(zBinGlob); |
| 571 | + if( pCfg->zBinGlob ){ |
| 572 | + Glob *pBinary = glob_create(pCfg->zBinGlob); |
| 582 | 573 | if( glob_match(pBinary, zName) ){ |
| 583 | 574 | fossil_print("%s",DIFF_CANNOT_COMPUTE_BINARY); |
| 584 | 575 | glob_free(pBinary); |
| 585 | 576 | return; |
| 586 | 577 | } |
| | @@ -594,11 +585,11 @@ |
| 594 | 585 | blob_write_to_file(pFile1, blob_str(&temp1)); |
| 595 | 586 | blob_write_to_file(pFile2, blob_str(&temp2)); |
| 596 | 587 | |
| 597 | 588 | /* Construct the external diff command */ |
| 598 | 589 | blob_zero(&cmd); |
| 599 | | - blob_append(&cmd, zDiffCmd, -1); |
| 590 | + blob_append(&cmd, pCfg->zDiffCmd, -1); |
| 600 | 591 | blob_append_escaped_arg(&cmd, blob_str(&temp1), 1); |
| 601 | 592 | blob_append_escaped_arg(&cmd, blob_str(&temp2), 1); |
| 602 | 593 | |
| 603 | 594 | /* Run the external diff command */ |
| 604 | 595 | fossil_system(blob_str(&cmd)); |
| | @@ -625,13 +616,10 @@ |
| 625 | 616 | ** for file names to treat as binary. If fIncludeBinary is zero, these files |
| 626 | 617 | ** will be skipped in addition to files that may contain binary content. |
| 627 | 618 | */ |
| 628 | 619 | void diff_against_disk( |
| 629 | 620 | const char *zFrom, /* Version to difference from */ |
| 630 | | - const char *zDiffCmd, /* Use this diff command. NULL for built-in */ |
| 631 | | - const char *zBinGlob, /* Treat file names matching this as binary */ |
| 632 | | - int fIncludeBinary, /* Treat file names matching this as binary */ |
| 633 | 621 | DiffConfig *pCfg, /* Flags controlling diff output */ |
| 634 | 622 | FileDirList *pFileDir, /* Which files to diff */ |
| 635 | 623 | Blob *diffBlob /* Blob to output diff instead of stdout */ |
| 636 | 624 | ){ |
| 637 | 625 | int vid; |
| | @@ -723,11 +711,10 @@ |
| 723 | 711 | srcid = 0; |
| 724 | 712 | if( !asNewFile ){ showDiff = 0; } |
| 725 | 713 | } |
| 726 | 714 | if( showDiff ){ |
| 727 | 715 | Blob content; |
| 728 | | - int isBin; |
| 729 | 716 | if( !isLink != !file_islink(zFullName) ){ |
| 730 | 717 | diff_print_index(zPathname, pCfg, 0); |
| 731 | 718 | diff_print_filenames(zPathname, zPathname, pCfg, 0); |
| 732 | 719 | fossil_print("%s",DIFF_CANNOT_COMPUTE_SYMLINK); |
| 733 | 720 | continue; |
| | @@ -735,14 +722,12 @@ |
| 735 | 722 | if( srcid>0 ){ |
| 736 | 723 | content_get(srcid, &content); |
| 737 | 724 | }else{ |
| 738 | 725 | blob_zero(&content); |
| 739 | 726 | } |
| 740 | | - isBin = fIncludeBinary ? 0 : looks_like_binary(&content); |
| 741 | 727 | diff_print_index(zPathname, pCfg, diffBlob); |
| 742 | | - diff_file(&content, isBin, zFullName, zPathname, zDiffCmd, |
| 743 | | - zBinGlob, fIncludeBinary, pCfg, 0, diffBlob); |
| 728 | + diff_file(&content, zFullName, zPathname, pCfg, 0, diffBlob); |
| 744 | 729 | blob_reset(&content); |
| 745 | 730 | } |
| 746 | 731 | blob_reset(&fname); |
| 747 | 732 | } |
| 748 | 733 | db_finalize(&q); |
| | @@ -758,13 +743,10 @@ |
| 758 | 743 | ** When using an external diff program, zBinGlob contains the GLOB patterns |
| 759 | 744 | ** for file names to treat as binary. If fIncludeBinary is zero, these files |
| 760 | 745 | ** will be skipped in addition to files that may contain binary content. |
| 761 | 746 | */ |
| 762 | 747 | static void diff_against_undo( |
| 763 | | - const char *zDiffCmd, /* Use this diff command. NULL for built-in */ |
| 764 | | - const char *zBinGlob, /* Treat file names matching this as binary */ |
| 765 | | - int fIncludeBinary, /* Treat file names matching this as binary */ |
| 766 | 748 | DiffConfig *pCfg, /* Flags controlling diff output */ |
| 767 | 749 | FileDirList *pFileDir /* List of files and directories to diff */ |
| 768 | 750 | ){ |
| 769 | 751 | Stmt q; |
| 770 | 752 | Blob content; |
| | @@ -774,12 +756,11 @@ |
| 774 | 756 | char *zFullName; |
| 775 | 757 | const char *zFile = (const char*)db_column_text(&q, 0); |
| 776 | 758 | if( !file_dir_match(pFileDir, zFile) ) continue; |
| 777 | 759 | zFullName = mprintf("%s%s", g.zLocalRoot, zFile); |
| 778 | 760 | db_column_blob(&q, 1, &content); |
| 779 | | - diff_file(&content, 0, zFullName, zFile, |
| 780 | | - zDiffCmd, zBinGlob, fIncludeBinary, pCfg, 0, 0); |
| 761 | + diff_file(&content, zFullName, zFile, pCfg, 0, 0); |
| 781 | 762 | fossil_free(zFullName); |
| 782 | 763 | blob_reset(&content); |
| 783 | 764 | } |
| 784 | 765 | db_finalize(&q); |
| 785 | 766 | } |
| | @@ -796,17 +777,13 @@ |
| 796 | 777 | ** will be skipped in addition to files that may contain binary content. |
| 797 | 778 | */ |
| 798 | 779 | static void diff_manifest_entry( |
| 799 | 780 | struct ManifestFile *pFrom, |
| 800 | 781 | struct ManifestFile *pTo, |
| 801 | | - const char *zDiffCmd, |
| 802 | | - const char *zBinGlob, |
| 803 | | - int fIncludeBinary, |
| 804 | 782 | DiffConfig *pCfg |
| 805 | 783 | ){ |
| 806 | 784 | Blob f1, f2; |
| 807 | | - int isBin1, isBin2; |
| 808 | 785 | int rid; |
| 809 | 786 | const char *zName; |
| 810 | 787 | if( pFrom ){ |
| 811 | 788 | zName = pFrom->zName; |
| 812 | 789 | }else if( pTo ){ |
| | @@ -826,14 +803,11 @@ |
| 826 | 803 | rid = uuid_to_rid(pTo->zUuid, 0); |
| 827 | 804 | content_get(rid, &f2); |
| 828 | 805 | }else{ |
| 829 | 806 | blob_zero(&f2); |
| 830 | 807 | } |
| 831 | | - isBin1 = fIncludeBinary ? 0 : looks_like_binary(&f1); |
| 832 | | - isBin2 = fIncludeBinary ? 0 : looks_like_binary(&f2); |
| 833 | | - diff_file_mem(&f1, &f2, isBin1, isBin2, zName, zDiffCmd, |
| 834 | | - zBinGlob, fIncludeBinary, pCfg); |
| 808 | + diff_file_mem(&f1, &f2, zName, pCfg); |
| 835 | 809 | blob_reset(&f1); |
| 836 | 810 | blob_reset(&f2); |
| 837 | 811 | } |
| 838 | 812 | |
| 839 | 813 | /* |
| | @@ -847,13 +821,10 @@ |
| 847 | 821 | ** will be skipped in addition to files that may contain binary content. |
| 848 | 822 | */ |
| 849 | 823 | static void diff_two_versions( |
| 850 | 824 | const char *zFrom, |
| 851 | 825 | const char *zTo, |
| 852 | | - const char *zDiffCmd, |
| 853 | | - const char *zBinGlob, |
| 854 | | - int fIncludeBinary, |
| 855 | 826 | DiffConfig *pCfg, |
| 856 | 827 | FileDirList *pFileDir |
| 857 | 828 | ){ |
| 858 | 829 | Manifest *pFrom, *pTo; |
| 859 | 830 | ManifestFile *pFromFile, *pToFile; |
| | @@ -879,12 +850,11 @@ |
| 879 | 850 | if( file_dir_match(pFileDir, pFromFile->zName) ){ |
| 880 | 851 | if( (pCfg->diffFlags & (DIFF_NUMSTAT|DIFF_HTML))==0 ){ |
| 881 | 852 | fossil_print("DELETED %s\n", pFromFile->zName); |
| 882 | 853 | } |
| 883 | 854 | if( asNewFlag ){ |
| 884 | | - diff_manifest_entry(pFromFile, 0, zDiffCmd, zBinGlob, |
| 885 | | - fIncludeBinary, pCfg); |
| 855 | + diff_manifest_entry(pFromFile, 0, pCfg); |
| 886 | 856 | } |
| 887 | 857 | } |
| 888 | 858 | pFromFile = manifest_file_next(pFrom,0); |
| 889 | 859 | }else if( cmp>0 ){ |
| 890 | 860 | if( file_dir_match(pFileDir, pToFile->zName) ){ |
| | @@ -891,12 +861,11 @@ |
| 891 | 861 | if( (pCfg->diffFlags & |
| 892 | 862 | (DIFF_NUMSTAT|DIFF_HTML|DIFF_TCL|DIFF_JSON))==0 ){ |
| 893 | 863 | fossil_print("ADDED %s\n", pToFile->zName); |
| 894 | 864 | } |
| 895 | 865 | if( asNewFlag ){ |
| 896 | | - diff_manifest_entry(0, pToFile, zDiffCmd, zBinGlob, |
| 897 | | - fIncludeBinary, pCfg); |
| 866 | + diff_manifest_entry(0, pToFile, pCfg); |
| 898 | 867 | } |
| 899 | 868 | } |
| 900 | 869 | pToFile = manifest_file_next(pTo,0); |
| 901 | 870 | }else if( fossil_strcmp(pFromFile->zUuid, pToFile->zUuid)==0 ){ |
| 902 | 871 | /* No changes */ |
| | @@ -906,12 +875,11 @@ |
| 906 | 875 | }else{ |
| 907 | 876 | if( file_dir_match(pFileDir, pToFile->zName) ){ |
| 908 | 877 | if( pCfg->diffFlags & DIFF_BRIEF ){ |
| 909 | 878 | fossil_print("CHANGED %s\n", pFromFile->zName); |
| 910 | 879 | }else{ |
| 911 | | - diff_manifest_entry(pFromFile, pToFile, zDiffCmd, zBinGlob, |
| 912 | | - fIncludeBinary, pCfg); |
| 880 | + diff_manifest_entry(pFromFile, pToFile, pCfg); |
| 913 | 881 | } |
| 914 | 882 | } |
| 915 | 883 | pFromFile = manifest_file_next(pFrom,0); |
| 916 | 884 | pToFile = manifest_file_next(pTo,0); |
| 917 | 885 | } |
| | @@ -1011,25 +979,10 @@ |
| 1011 | 979 | fossil_free(zCmd); |
| 1012 | 980 | } |
| 1013 | 981 | blob_reset(&script); |
| 1014 | 982 | } |
| 1015 | 983 | |
| 1016 | | -/* |
| 1017 | | -** Returns non-zero if files that may be binary should be used with external |
| 1018 | | -** diff programs. |
| 1019 | | -*/ |
| 1020 | | -int diff_include_binary_files(void){ |
| 1021 | | - const char* zArgIncludeBinary = find_option("diff-binary", 0, 1); |
| 1022 | | - |
| 1023 | | - /* Command line argument have priority on settings */ |
| 1024 | | - if( zArgIncludeBinary ){ |
| 1025 | | - return is_truth(zArgIncludeBinary); |
| 1026 | | - }else{ |
| 1027 | | - return db_get_boolean("diff-binary", 1); |
| 1028 | | - } |
| 1029 | | -} |
| 1030 | | - |
| 1031 | 984 | /* |
| 1032 | 985 | ** Returns the GLOB pattern for file names that should be treated as binary |
| 1033 | 986 | ** by the diff subsystem, if any. |
| 1034 | 987 | */ |
| 1035 | 988 | const char *diff_get_binary_glob(void){ |
| | @@ -1117,40 +1070,28 @@ |
| 1117 | 1070 | ** -W|--width N Width of lines in side-by-side diff |
| 1118 | 1071 | ** -Z|--ignore-trailing-space Ignore changes to end-of-line whitespace |
| 1119 | 1072 | */ |
| 1120 | 1073 | void diff_cmd(void){ |
| 1121 | 1074 | int isGDiff; /* True for gdiff. False for normal diff */ |
| 1122 | | - int isInternDiff; /* True for internal diff */ |
| 1123 | | - int verboseFlag; /* True if -v or --verbose flag is used */ |
| 1124 | 1075 | const char *zFrom; /* Source version number */ |
| 1125 | 1076 | const char *zTo; /* Target version number */ |
| 1126 | 1077 | const char *zCheckin; /* Check-in version number */ |
| 1127 | 1078 | const char *zBranch; /* Branch to diff */ |
| 1128 | | - const char *zDiffCmd = 0; /* External diff command. NULL for internal diff */ |
| 1129 | | - const char *zBinGlob = 0; /* Treat file names matching this as binary */ |
| 1130 | | - int fIncludeBinary = 0; /* Include binary files for external diff */ |
| 1131 | 1079 | int againstUndo = 0; /* Diff against files in the undo buffer */ |
| 1132 | 1080 | FileDirList *pFileDir = 0; /* Restrict the diff to these files */ |
| 1133 | 1081 | DiffConfig DCfg; /* Diff configuration object */ |
| 1134 | 1082 | |
| 1135 | 1083 | if( find_option("tk",0,0)!=0 || has_option("tclsh") ){ |
| 1136 | 1084 | diff_tk("diff", 2); |
| 1137 | 1085 | return; |
| 1138 | 1086 | } |
| 1139 | 1087 | isGDiff = g.argv[1][0]=='g'; |
| 1140 | | - isInternDiff = find_option("internal","i",0)!=0; |
| 1141 | 1088 | zFrom = find_option("from", "r", 1); |
| 1142 | 1089 | zTo = find_option("to", 0, 1); |
| 1143 | 1090 | zCheckin = find_option("checkin", 0, 1); |
| 1144 | 1091 | zBranch = find_option("branch", 0, 1); |
| 1145 | 1092 | againstUndo = find_option("undo",0,0)!=0; |
| 1146 | | - diff_options(&DCfg, isGDiff); |
| 1147 | | - verboseFlag = find_option("verbose","v",0)!=0; |
| 1148 | | - if( !verboseFlag ){ |
| 1149 | | - verboseFlag = find_option("new-file","N",0)!=0; /* deprecated */ |
| 1150 | | - } |
| 1151 | | - if( verboseFlag ) DCfg.diffFlags |= DIFF_VERBOSE; |
| 1152 | 1093 | if( againstUndo && ( zFrom!=0 || zTo!=0 || zCheckin!=0 || zBranch!=0) ){ |
| 1153 | 1094 | fossil_fatal("cannot use --undo together with --from, --to, --checkin," |
| 1154 | 1095 | " or --branch"); |
| 1155 | 1096 | } |
| 1156 | 1097 | if( zBranch ){ |
| | @@ -1169,18 +1110,11 @@ |
| 1169 | 1110 | }else if( zFrom==0 ){ |
| 1170 | 1111 | fossil_fatal("must use --from if --to is present"); |
| 1171 | 1112 | }else{ |
| 1172 | 1113 | db_find_and_open_repository(0, 0); |
| 1173 | 1114 | } |
| 1174 | | - if( !isInternDiff |
| 1175 | | - && (DCfg.diffFlags & DIFF_HTML)==0 /* External diff can't generate HTML */ |
| 1176 | | - ){ |
| 1177 | | - zDiffCmd = find_option("command", 0, 1); |
| 1178 | | - if( zDiffCmd==0 ) zDiffCmd = diff_command_external(isGDiff); |
| 1179 | | - } |
| 1180 | | - zBinGlob = diff_get_binary_glob(); |
| 1181 | | - fIncludeBinary = diff_include_binary_files(); |
| 1115 | + diff_options(&DCfg, isGDiff, 0); |
| 1182 | 1116 | determine_exec_relative_option(1); |
| 1183 | 1117 | verify_all_options(); |
| 1184 | 1118 | if( g.argc>=3 ){ |
| 1185 | 1119 | int i; |
| 1186 | 1120 | Blob fname; |
| | @@ -1214,18 +1148,15 @@ |
| 1214 | 1148 | if( againstUndo ){ |
| 1215 | 1149 | if( db_lget_int("undo_available",0)==0 ){ |
| 1216 | 1150 | fossil_print("No undo or redo is available\n"); |
| 1217 | 1151 | return; |
| 1218 | 1152 | } |
| 1219 | | - diff_against_undo(zDiffCmd, zBinGlob, fIncludeBinary, |
| 1220 | | - &DCfg, pFileDir); |
| 1153 | + diff_against_undo(&DCfg, pFileDir); |
| 1221 | 1154 | }else if( zTo==0 ){ |
| 1222 | | - diff_against_disk(zFrom, zDiffCmd, zBinGlob, fIncludeBinary, |
| 1223 | | - &DCfg, pFileDir, 0); |
| 1155 | + diff_against_disk(zFrom, &DCfg, pFileDir, 0); |
| 1224 | 1156 | }else{ |
| 1225 | | - diff_two_versions(zFrom, zTo, zDiffCmd, zBinGlob, fIncludeBinary, |
| 1226 | | - &DCfg, pFileDir); |
| 1157 | + diff_two_versions(zFrom, zTo, &DCfg, pFileDir); |
| 1227 | 1158 | } |
| 1228 | 1159 | if( pFileDir ){ |
| 1229 | 1160 | int i; |
| 1230 | 1161 | for(i=0; pFileDir[i].zName; i++){ |
| 1231 | 1162 | if( pFileDir[i].nUsed==0 |
| | @@ -1259,7 +1190,7 @@ |
| 1259 | 1190 | if( !g.perm.Read ){ login_needed(g.anon.Read); return; } |
| 1260 | 1191 | if( zFrom==0 || zTo==0 ) fossil_redirect_home(); |
| 1261 | 1192 | |
| 1262 | 1193 | cgi_set_content_type("text/plain"); |
| 1263 | 1194 | diff_config_init(&DCfg, DIFF_VERBOSE); |
| 1264 | | - diff_two_versions(zFrom, zTo, 0, 0, 0, &DCfg, 0); |
| 1195 | + diff_two_versions(zFrom, zTo, &DCfg, 0); |
| 1265 | 1196 | } |
| 1266 | 1197 | |