Changeset 830 for cprs/trunk/CPRS-Chart/fPtSel.pas
- Timestamp:
- Jul 7, 2010, 4:51:54 PM (14 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
cprs/trunk/CPRS-Chart/fPtSel.pas
r456 r830 12 12 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, 13 13 StdCtrls, ORCtrls, ExtCtrls, ORFn, ORNet, ORDtTmRng, Gauges, Menus, ComCtrls, 14 UBAGlobals, UBACore ;14 UBAGlobals, UBACore, fBase508Form, VA508AccessibilityManager, uConst; 15 15 16 16 type 17 TfrmPtSel = class(T Form)17 TfrmPtSel = class(TfrmBase508Form) 18 18 pnlPtSel: TORAutoPanel; 19 19 cboPatient: TORComboBox; … … 40 40 RadioGroup1: TRadioGroup ; 41 41 //RadioGroup1: TRadioGroup; 42 cmdComments: TButton; 42 43 procedure cmdOKClick(Sender: TObject); 43 44 procedure cmdCancelClick(Sender: TObject); … … 73 74 procedure lstvAlertsInfoTip(Sender: TObject; Item: TListItem; 74 75 var InfoTip: String); 75 procedure FormKeyDown(Sender: TObject; var Key: Word;76 Shift: TShiftState);77 76 procedure lstvAlertsKeyDown(Sender: TObject; var Key: Word; 78 77 Shift: TShiftState); 79 78 procedure FormShow(Sender: TObject); 79 procedure FormCreate(Sender: TObject); 80 procedure FormResize(Sender: TObject); 81 procedure cmdCommentsClick(Sender: TObject); 80 82 81 83 //VWPT ENAHANCED PATIENT LOOKUP … … 90 92 FsortDirection: string; 91 93 FUserCancelled: boolean; 94 FNotificationBtnsAdjusted: Boolean; 95 FAlertsNotReady: boolean; 96 procedure WMReadyAlert(var Message: TMessage); message UM_MISC; 97 procedure ReadyAlert; 92 98 procedure AdjustFormSize(ShowNotif: Boolean; FontSize: Integer); 93 99 procedure ClearIDInfo; … … 99 105 procedure AlertList; 100 106 procedure ReformatAlertDateTime; 107 procedure AdjustButtonSize(pButton:TButton); 108 procedure AdjustNotificationButtons; 109 101 110 public 102 111 procedure Loaded; override; … … 111 120 RPLProblem: boolean; // Allows close of form if there's an RPL problem. 112 121 PtStrs: TStringList; 113 SortViaKeyboard: boolean; 114 //vwpt enhancement122 123 //vwpt enhancement 115 124 itimson : integer = 1; 116 125 enhanceskip : integer = 0; 117 126 radiogrp1index : integer = 0; 127 128 118 129 implementation 119 130 120 131 {$R *.DFM} 121 132 122 uses rCore,uCore, fDupPts, fPtSens, fPtSelDemog, fPtSelOptns, fPatientFlagMulti, 123 uOrPtf, fAlertForward, rMisc, fFrame; 133 uses rCore, uCore, fDupPts, fPtSens, fPtSelDemog, fPtSelOptns, fPatientFlagMulti, 134 uOrPtf, fAlertForward, rMisc, fFrame, fRptBox, VA508AccessibilityRouter; 135 136 resourcestring 137 StrFPtSel_lstvAlerts_Co = 'C'+U+'fPtSel.lstvAlerts.Cols'; 124 138 125 139 const 126 TX_DGSR_ERR = 'Unable to perform sensitive record checks';127 TC_DGSR_ERR = 'Error';128 TC_DGSR_SHOW = 'Restricted Record';129 TC_DGSR_DENY = 'Access Denied';130 TX_DGSR_YESNO = CRLF + 'Do you want to continue processing this patient record?';131 140 AliasString = ' -- ALIAS'; 132 141 133 //VWPT ENAHANCED PATIENT LOOKUP142 //VWPT ENAHANCED PATIENT LOOKUP 134 143 function TfrmPtSel.IsOther(itemindex:Integer):Boolean; 135 144 var … … 140 149 if (RadioGroup1.ItemIndex = -1) or (RadioGroup1.ItemIndex = 0) or (itimson = 0) then Result := False; 141 150 end; 142 143 144 145 151 146 152 procedure SelectPatient(ShowNotif: Boolean; FontSize: Integer; var UserCancelled: boolean); … … 224 230 if SplitterTop <> 0 then 225 231 pnlPtSel.Height := SplitterTop; 232 FNotificationBtnsAdjusted := False; 233 AdjustButtonSize(cmdSaveList); 234 AdjustButtonSize(cmdProcessInfo); 235 AdjustButtonSize(cmdProcessAll); 236 AdjustButtonSize(cmdProcess); 237 AdjustButtonSize(cmdForward); 238 AdjustButtonSize(cmdRemove); 239 AdjustButtonSize(cmdComments); 240 AdjustNotificationButtons; 226 241 end; 227 242 … … 255 270 Items.Add(LLS_SPACE); 256 271 cboPatient.InitLongList(''); 272 //VWPT 273 //cboPatient.LongList := True; 274 //cboPateint.HintonItem := True; 275 //end 257 276 RedrawActivate(cboPatient.Handle); 258 277 end; … … 341 360 cboPatient.Caption := lblPatient.Caption; 342 361 cboPatient.InitLongList(''); 343 //VWPT344 //cboPatient.LongList := True;345 //cboPateint.HintonItem := True;346 //end347 362 RedrawActivate(cboPatient.Handle); 348 363 end; … … 386 401 end; 387 402 end; 403 388 404 var caption:string; 389 index:integer; 405 index:integer; 406 407 390 408 begin 391 409 with cboPatient do … … 425 443 else 426 444 ListPtByFullSSN(Items, Text); 427 ShowMatchingPatients ;445 ShowMatchingPatients 428 446 end 429 430 447 else if (not IsOther(integer(1))) and (IsRPL <> '1')and (enhanceskip=0) and (frmPtSelOptns.IsEnhanced(Text)) and (not frmPtSelOptns.IsPatientName(Text)) then 431 448 begin … … 449 466 begin 450 467 ShowIDInfo; 468 ShowFlagInfo; 469 end else 470 begin 471 ClearIDInfo; 472 end; 473 end; 474 475 procedure TfrmPtSel.cboPatientMouseClick(Sender: TObject); 476 begin 477 if Length(cboPatient.ItemID) > 0 then //*DFN* 478 begin 479 ShowIDInfo; 451 480 ShowFlagInfo; 452 481 end else … … 456 485 end; 457 486 458 procedure TfrmPtSel.cboPatient MouseClick(Sender: TObject);487 procedure TfrmPtSel.cboPatientDblClick(Sender: TObject); 459 488 begin 460 489 // vwpt enhanced on click or double clck set mode back to normal to a.) not allow change event … … 471 500 472 501 //end vwpt enhanced 473 if Length(cboPatient.ItemID) > 0 then //*DFN*474 begin475 ShowIDInfo;476 ShowFlagInfo;477 end else478 begin479 ClearIDInfo;480 end;481 end;482 483 procedure TfrmPtSel.cboPatientDblClick(Sender: TObject);484 begin485 // vwpt enhanced on click or double clck set mode back to normal to a.) not allow change event486 //erroneiusly checked with false lookup, and b.0 immedicately put back into normal mode487 //withut separate step needed.488 if (RadioGroup1.ItemIndex > 0 ) then489 begin490 // itimson :=0 ;//no check for timson change in cbopatient until after click event finished491 RadioGroup1.ItemIndex := 0;492 RadioGroup1.SetFocus;493 RadioGroup1.Refresh;494 495 end;496 //end vwpt enhanced497 502 if Length(cboPatient.ItemID) > 0 then cmdOKClick(Self); //*DFN* 498 503 end; … … 505 510 PatientList: TStringList; 506 511 begin 507 508 NoAlias := StartFrom; 509 with Sender as TORComboBox do 512 NoAlias := StartFrom; 513 with Sender as TORComboBox do 510 514 if Items.Count > ShortCount then 515 begin 511 516 NoAlias := Piece(Items[Items.Count-1], U, 1) + U + NoAlias; 512 if pos(AliasString, NoAlias)>0 then513 NoAlias := Copy(NoAlias, 1, pos(AliasString, NoAlias)-1);514 PatientList := TStringList.Create;515 try 516 begin517 if (IsRPL = '1') then // Restricted patient lists uses different feed for long list box:518 PatientList.Assign(ReadRPLPtList(RPLJob, NoAlias, Direction))519 else520 begin521 PatientList.Assign(SubSetOfPatients(NoAlias, Direction));522 for i := 0 to PatientList.Count-1 do // Add " - Alias" to alias names:517 if Direction < 0 then 518 NoAlias := Copy(NoAlias, 1, Length(NoAlias) - 1); 519 end; 520 if pos(AliasString, NoAlias) > 0 then 521 NoAlias := Copy(NoAlias, 1, pos(AliasString, NoAlias) - 1); 522 PatientList := TStringList.Create; 523 try 524 begin 525 if (IsRPL = '1') then // Restricted patient lists uses different feed for long list box: 526 FastAssign(ReadRPLPtList(RPLJob, NoAlias, Direction), PatientList) 527 else 523 528 begin 524 Patient := PatientList[i]; 525 // Piece 6 avoids display problems when mixed with "RPL" lists: 526 if (Uppercase(Piece(Patient, U, 2)) <> Uppercase(Piece(Patient, U, 6))) then 529 FastAssign(SubSetOfPatients(NoAlias, Direction), PatientList); 530 for i := 0 to PatientList.Count - 1 do // Add " - Alias" to alias names: 527 531 begin 528 SetPiece(Patient, U, 2, Piece(Patient, U, 2) + AliasString); 529 PatientList[i] := Patient; 532 Patient := PatientList[i]; 533 // Piece 6 avoids display problems when mixed with "RPL" lists: 534 if (Uppercase(Piece(Patient, U, 2)) <> Uppercase(Piece(Patient, U, 6))) then 535 begin 536 SetPiece(Patient, U, 2, Piece(Patient, U, 2) + AliasString); 537 PatientList[i] := Patient; 538 end; 530 539 end; 531 540 end; 541 cboPatient.ForDataUse(PatientList); 532 542 end; 533 cboPatient.ForDataUse(PatientList); 534 end; 535 finally 536 PatientList.Free; 537 end; 538 543 finally 544 PatientList.Free; 545 end; 539 546 end; 540 547 … … 547 554 begin 548 555 frmPtSelDemog.ShowDemog(cboPatient.ItemID); 556 end; 557 558 procedure TfrmPtSel.WMReadyAlert(var Message: TMessage); 559 begin 560 ReadyAlert; 561 Message.Result := 0; 549 562 end; 550 563 … … 555 568 const 556 569 DLG_CANCEL = False; 557 DGSR_FAIL = -1; 558 DGSR_NONE = 0; 559 DGSR_SHOW = 1; 560 DGSR_ASK = 2; 561 DGSR_DENY = 3; 562 var 563 NewDFN, AMsg: string; //*DFN* 564 AccessStatus: Integer; 570 var 571 NewDFN: string; //*DFN* 565 572 DateDied: TFMDateTime; 573 AccessStatus: integer; 566 574 begin 567 575 // vwpt enhanced on click or double clck set mode back to normal to a.) not allow change event … … 594 602 else 595 603 NewDFN := DupDFN; 596 CheckSensitiveRecordAccess(NewDFN, AccessStatus, AMsg); 597 case AccessStatus of 598 DGSR_FAIL: begin 599 InfoBox(TX_DGSR_ERR, TC_DGSR_ERR, MB_OK); 600 Exit; 601 end; 602 DGSR_NONE: { Nothing - allow access to the patient. }; 603 DGSR_SHOW: InfoBox(AMsg, TC_DGSR_SHOW, MB_OK); 604 DGSR_ASK: if InfoBox(AMsg + TX_DGSR_YESNO, TC_DGSR_SHOW, MB_YESNO or MB_ICONWARNING or 605 MB_DEFBUTTON2) = IDYES then LogSensitiveRecordAccess(NewDFN) else Exit; 606 else begin 607 InfoBox(AMsg, TC_DGSR_DENY, MB_OK); 608 Exit; 609 end; 610 end; 604 if not AllowAccessToSensitivePatient(NewDFN, AccessStatus) then exit; 611 605 DateDied := DateOfDeath(NewDFN); 612 606 if (DateDied > 0) and (InfoBox('This patient died ' + FormatFMDateTime('mmm dd,yyyy hh:nn', DateDied) + CRLF + … … 665 659 end; 666 660 661 procedure TfrmPtSel.cmdCommentsClick(Sender: TObject); 662 var 663 tmpCmt: TStringList; 664 begin 665 if FAlertsNotReady then exit; 666 inherited; 667 tmpCmt := TStringList.Create; 668 try 669 tmpCmt.Text := lstvAlerts.Selected.SubItems[8]; 670 LimitStringLength(tmpCmt, 74); 671 tmpCmt.Insert(0, StringOfChar('-', 74)); 672 tmpCmt.Insert(0, lstvAlerts.Selected.SubItems[4]); 673 tmpCmt.Insert(0, lstvAlerts.Selected.SubItems[3]); 674 tmpCmt.Insert(0, lstvAlerts.Selected.SubItems[0]); 675 ReportBox(tmpCmt, 'Forwarded by: ' + lstvAlerts.Selected.SubItems[5], TRUE); 676 lstvAlerts.SetFocus; 677 finally 678 tmpCmt.Free; 679 end; 680 end; 681 667 682 procedure TfrmPtSel.cmdProcessClick(Sender: TObject); 668 683 var … … 671 686 ADFN, x, RecordID, XQAID: string; //*DFN* 672 687 begin 688 if FAlertsNotReady then exit; 673 689 enableclose := false; 674 690 with lstvAlerts do … … 766 782 i: integer; 767 783 begin 784 if FAlertsNotReady then exit; 768 785 if lstvAlerts.Items.Count = 0 then Exit; 769 786 if InfoBox('You are about to process all your INFORMATION alerts.' + CRLF … … 787 804 i: integer; 788 805 begin 806 if FAlertsNotReady then exit; 789 807 for i := 0 to lstvAlerts.Items.Count-1 do 790 808 lstvAlerts.Items[i].Selected := True; … … 803 821 Alert: String; 804 822 begin 823 if FAlertsNotReady then exit; 805 824 try 806 825 with lstvAlerts do … … 826 845 i: integer; 827 846 begin 847 if FAlertsNotReady then exit; 828 848 with lstvAlerts do 829 849 begin … … 851 871 end; 852 872 873 procedure TfrmPtSel.FormResize(Sender: TObject); 874 begin 875 inherited; 876 FNotificationBtnsAdjusted := False; 877 AdjustButtonSize(cmdSaveList); 878 AdjustButtonSize(cmdProcessInfo); 879 AdjustButtonSize(cmdProcessAll); 880 AdjustButtonSize(cmdProcess); 881 AdjustButtonSize(cmdForward); 882 AdjustButtonSize(cmdComments); 883 AdjustButtonSize(cmdRemove); 884 AdjustNotificationButtons; 885 end; 886 853 887 procedure TfrmPtSel.pnlPtSelResize(Sender: TObject); 854 888 begin 855 889 frmPtSelDemog.Left := cboPatient.Left + cboPatient.Width + 9; 856 // frmPtSelDemog.Width := frmPtSel.CmdCancel.Left - frmPtSelDemog.Left-2;// before vwpt enhancements pnlPtSel.Width - frmPtSelDemog.Left - 2;890 // frmPtSelDemog.Width := frmPtSel.CmdCancel.Left - frmPtSelDemog.Left-2;// before vwpt enhancements pnlPtSel.Width - frmPtSelDemog.Left - 2; 857 891 frmPtSelOptns.Width := cboPatient.Left-8; 858 892 end; … … 885 919 end; 886 920 //end vwpt enhancements 921 887 922 frmPtSelOptns := TfrmPtSelOptns.Create(Self); // Was application - kcm 888 923 with frmPtSelOptns do … … 915 950 916 951 procedure TfrmPtSel.FormClose(Sender: TObject; var Action: TCloseAction); 917 begin 952 var 953 colSizes : String; 954 begin 955 colSizes := ''; 956 with lstvAlerts do begin 957 colSizes := IntToStr(Columns[0].Width) + ','; //Info Caption 958 colSizes := colSizes + IntToStr(Columns[1].Width) + ','; //Patient SubItems[0] 959 colSizes := colSizes + IntToStr(Columns[2].Width) + ','; //Location SubItems[1] 960 colSizes := colSizes + IntToStr(Columns[3].Width) + ','; //Urgency SubItems[2] 961 colSizes := colSizes + IntToStr(Columns[4].Width) + ','; //Alert Date/Time SubItems[3] 962 colSizes := colSizes + IntToStr(Columns[5].Width) + ','; //Message Text SubItems[4] 963 colSizes := colSizes + IntToStr(Columns[6].Width); //Forwarded By/When SubItems[5] 964 end; 965 SizeHolder.SetSize(StrFPtSel_lstvAlerts_Co,colSizes); 918 966 919 967 if (IsRPL = '1') then // Deal with restricted patient list users. 920 968 KillRPLPtList(RPLJob); // Kills server global data each time. 921 969 // (Global created by MakeRPLPtList in rCore.) 970 end; 971 972 procedure TfrmPtSel.FormCreate(Sender: TObject); 973 begin 974 inherited; 975 DefaultButton := cmdOK; 976 FAlertsNotReady := FALSE; 922 977 end; 923 978 … … 1005 1060 NewItem: TListItem; 1006 1061 I,J: Integer; 1007 Comment : String;1062 Comment,colSizes : String; 1008 1063 begin 1009 1064 // Load the items 1065 colSizes := ''; 1010 1066 lstvAlerts.Items.Clear; 1011 1067 List := TStringList.Create; … … 1036 1092 with lstvAlerts do 1037 1093 begin 1038 Columns[0].Width := 30; //Info Caption 1039 Columns[1].Width := 120; //Patient SubItems[0] 1040 Columns[2].Width := 60; //Location SubItems[1] 1041 Columns[3].Width := 60; //Urgency SubItems[2] 1042 Columns[4].Width := 110; //Alert Date/Time SubItems[3] 1043 Columns[5].Width := 312; //Message Text SubItems[4] 1044 Columns[6].Width := 210; //Forwarded By/When SubItems[5] 1094 colSizes := SizeHolder.GetSize(StrFPtSel_lstvAlerts_Co); 1095 if colSizes = '' then begin 1096 Columns[0].Width := 40; //Info Caption 1097 Columns[1].Width := 195; //Patient SubItems[0] 1098 Columns[2].Width := 75; //Location SubItems[1] 1099 Columns[3].Width := 95; //Urgency SubItems[2] 1100 Columns[4].Width := 150; //Alert Date/Time SubItems[3] 1101 Columns[5].Width := 310; //Message Text SubItems[4] 1102 Columns[6].Width := 290; //Forwarded By/When SubItems[5] 1103 end else begin 1104 Columns[0].Width := StrToInt(piece(colSizes,',',1)); //Info Caption 1105 Columns[1].Width := StrToInt(piece(colSizes,',',2)); //Patient SubItems[0] 1106 Columns[2].Width := StrToInt(piece(colSizes,',',3)); //Location SubItems[1] 1107 Columns[3].Width := StrToInt(piece(colSizes,',',4)); //Urgency SubItems[2] 1108 Columns[4].Width := StrToInt(piece(colSizes,',',5)); //Alert Date/Time SubItems[3] 1109 Columns[5].Width := StrToInt(piece(colSizes,',',6)); //Message Text SubItems[4] 1110 Columns[6].Width := StrToInt(piece(colSizes,',',7)); //Forwarded By/When SubItems[5] 1111 end; 1112 1045 1113 //Items not displayed in Columns: XQAID SubItems[6] 1046 1114 // Remove w/o process SubItems[7] … … 1055 1123 begin 1056 1124 1057 if ( (FsortCol = Column.Index) and (not SortViaKeyboard)) then1125 if (FsortCol = Column.Index) then 1058 1126 FsortAscending := not FsortAscending; 1059 1127 … … 1069 1137 else 1070 1138 lstvAlerts.AlphaSort; 1071 SortViaKeyboard := false;1072 1073 1139 1074 1140 //Set the Notifications sort method to last-used sort-type … … 1151 1217 if HasFlag then 1152 1218 begin 1153 // lstFlags.Items.Assign(FlagList);1219 // FastAssign(FlagList, lstFlags.Items); 1154 1220 // pnlPrf.Visible := True; 1155 1221 end … … 1173 1239 Selected: Boolean); 1174 1240 begin 1175 if lstvAlerts.SelCount <= 0 then ShowButts(False) 1176 else ShowButts(True); 1177 GetBAStatus(User.DUZ,Patient.DFN); 1241 if ScreenReaderSystemActive then 1242 begin 1243 FAlertsNotReady := TRUE; 1244 PostMessage(Handle, UM_MISC, 0, 0); 1245 end 1246 else 1247 ReadyAlert; 1178 1248 end; 1179 1249 … … 1183 1253 cmdRemove.Enabled := ShowButts; 1184 1254 cmdForward.Enabled := ShowButts; 1255 cmdComments.Enabled := ShowButts and (lstvAlerts.SelCount = 1) and (lstvAlerts.Selected.SubItems[8] <> ''); 1185 1256 end; 1186 1257 … … 1189 1260 begin 1190 1261 InfoTip := Item.SubItems[8]; 1191 end;1192 1193 procedure TfrmPtSel.FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);1194 {1195 var1196 keyValue: word;1197 }1198 begin{1199 keyValue := MapVirtualKey(Key,2);1200 if keyValue = VK_RETURN then1201 cmdProcessClick(Sender);1202 }1203 1262 end; 1204 1263 … … 1210 1269 } 1211 1270 begin 1271 if FAlertsNotReady then exit; 1212 1272 if lstvAlerts.Focused then 1213 1273 begin 1214 SortViaKeyboard := true;1215 1274 case Key of 1216 1275 VK_RETURN: cmdProcessClick(Sender); //Process all selected alerts … … 1252 1311 'F','f': lstvAlertsColumnClick(Sender, lstvAlerts.Columns[6]); 1253 1312 end; 1313 1254 1314 end; 1255 1315 1256 1316 //hds7397- ge 2/6/6 sort and display date/time column correctly - as requested 1317 procedure TfrmPtSel.ReadyAlert; 1318 begin 1319 if lstvAlerts.SelCount <= 0 then ShowButts(False) 1320 else ShowButts(True); 1321 GetBAStatus(User.DUZ,Patient.DFN); 1322 FAlertsNotReady := FALSE; 1323 end; 1324 1257 1325 procedure TfrmPtSel.ReformatAlertDateTime; 1258 1326 var … … 1287 1355 end; 1288 1356 1357 procedure TfrmPtSel.AdjustButtonSize(pButton:TButton); 1358 var 1359 thisButton: TButton; 1360 const Gap = 5; 1361 begin 1362 thisButton := pButton; 1363 if thisButton.Width < frmFrame.Canvas.TextWidth(thisButton.Caption) then //CQ2737 GE 1364 begin 1365 FNotificationBtnsAdjusted := (thisButton.Width < frmFrame.Canvas.TextWidth(thisButton.Caption)); 1366 thisButton.Width := (frmFrame.Canvas.TextWidth(thisButton.Caption) + Gap+Gap); //CQ2737 GE 1367 end; 1368 if thisButton.Height < frmFrame.Canvas.TextHeight(thisButton.Caption) then //CQ2737 GE 1369 thisButton.Height := (frmFrame.Canvas.TextHeight(thisButton.Caption) + Gap); //CQ2737 GE 1370 end; 1371 1372 procedure TfrmPtSel.AdjustNotificationButtons; 1373 const 1374 Gap = 10; BigGap = 40; 1375 // reposition buttons after resizing eliminate overlap. 1376 begin 1377 if FNotificationBtnsAdjusted then 1378 begin 1379 cmdProcessAll.Left := (cmdProcessInfo.Left + cmdProcessInfo.Width + Gap); 1380 cmdProcess.Left := (cmdProcessAll.Left + cmdProcessAll.Width + Gap); 1381 cmdForward.Left := (cmdProcess.Left + cmdProcess.Width + Gap); 1382 cmdComments.Left := (cmdForward.Left + cmdForward.Width + Gap); 1383 cmdRemove.Left := (cmdComments.Left + cmdComments.Width + BigGap); 1384 end; 1385 end; 1289 1386 1290 1387 //vwpt enhanced // … … 1320 1417 end; 1321 1418 //end vwpt enhanced 1322 Initialization 1323 SortViaKeyboard := false; 1419 1324 1420 1325 1421 end.
Note:
See TracChangeset
for help on using the changeset viewer.