View | Details | Raw Unified | Return to bug 13116
Collapse All | Expand All

(-)a/C4/ILSDI/Services.pm (-3 / +3 lines)
Lines 489-495 sub GetServices { Link Here
489
    # Reserve level management
489
    # Reserve level management
490
    my $biblionumber = $item->{'biblionumber'};
490
    my $biblionumber = $item->{'biblionumber'};
491
    my $canbookbereserved = CanBookBeReserved( $borrower, $biblionumber );
491
    my $canbookbereserved = CanBookBeReserved( $borrower, $biblionumber );
492
    if ($canbookbereserved) {
492
    if ($canbookbereserved eq 'OK') {
493
        push @availablefor, 'title level hold';
493
        push @availablefor, 'title level hold';
494
        my $canitembereserved = IsAvailableForItemLevelRequest($itemnumber);
494
        my $canitembereserved = IsAvailableForItemLevelRequest($itemnumber);
495
        if ($canitembereserved) {
495
        if ($canitembereserved) {
Lines 609-615 sub HoldTitle { Link Here
609
    my $title = $$biblio{title};
609
    my $title = $$biblio{title};
610
610
611
    # Check if the biblio can be reserved
611
    # Check if the biblio can be reserved
612
    return { code => 'NotHoldable' } unless CanBookBeReserved( $borrowernumber, $biblionumber );
612
    return { code => 'NotHoldable' } unless CanBookBeReserved( $borrowernumber, $biblionumber ) eq 'OK';
613
613
614
    my $branch;
614
    my $branch;
615
615
Lines 687-693 sub HoldItem { Link Here
687
    # Check for item disponibility
687
    # Check for item disponibility
688
    my $canitembereserved = C4::Reserves::CanItemBeReserved( $borrowernumber, $itemnumber );
688
    my $canitembereserved = C4::Reserves::CanItemBeReserved( $borrowernumber, $itemnumber );
689
    my $canbookbereserved = C4::Reserves::CanBookBeReserved( $borrowernumber, $biblionumber );
689
    my $canbookbereserved = C4::Reserves::CanBookBeReserved( $borrowernumber, $biblionumber );
690
    return { code => 'NotHoldable' } unless $canbookbereserved and $canitembereserved;
690
    return { code => 'NotHoldable' } unless $canbookbereserved eq 'OK' and $canitembereserved eq 'OK';
691
691
692
    # Pickup branch management
692
    # Pickup branch management
693
    my $branch;
693
    my $branch;
(-)a/C4/Reserves.pm (-10 / +20 lines)
Lines 448-454 sub GetReservesFromBorrowernumber { Link Here
448
#-------------------------------------------------------------------------------------
448
#-------------------------------------------------------------------------------------
449
=head2 CanBookBeReserved
449
=head2 CanBookBeReserved
450
450
451
  $error = &CanBookBeReserved($borrowernumber, $biblionumber)
451
  $canReserve = &CanBookBeReserved($borrowernumber, $biblionumber)
452
  if ($canReserve eq 'OK') { #We can reserve this Item! }
453
454
See CanItemBeReserved() for possible return values.
452
455
453
=cut
456
=cut
454
457
Lines 462-478 sub CanBookBeReserved{ Link Here
462
    push (@$items,@hostitems);
465
    push (@$items,@hostitems);
463
    }
466
    }
464
467
468
	my $canReserve;
465
    foreach my $item (@$items){
469
    foreach my $item (@$items){
466
        return 1 if CanItemBeReserved($borrowernumber, $item);
470
		$canReserve = CanItemBeReserved($borrowernumber, $item);
471
        return 'OK' if $canReserve eq 'OK';
467
    }
472
    }
468
    return 0;
473
    return $canReserve;
469
}
474
}
470
475
471
=head2 CanItemBeReserved
476
=head2 CanItemBeReserved
472
477
473
  $error = &CanItemBeReserved($borrowernumber, $itemnumber)
478
  $canReserve = &CanItemBeReserved($borrowernumber, $itemnumber)
479
  if ($canReserve eq 'OK') { #We can reserve this Item! }
474
480
475
This function return 1 if an item can be issued by this borrower.
481
@RETURNS OK,              if the Item can be reserved.
482
         ageRestricted,   if the Item is age restricted for this borrower.
483
         damaged,         if the Item is damaged.
484
         cannotReserveFromOtherBranches, if syspref 'canreservefromotherbranches' is OK.
485
         tooManyReserves, if the borrower has exceeded his maximum reserve amount.
476
486
477
=cut
487
=cut
478
488
Lines 490-500 sub CanItemBeReserved{ Link Here
490
    my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber);     
500
    my $borrower = C4::Members::GetMember('borrowernumber'=>$borrowernumber);     
491
501
492
    # If an item is damaged and we don't allow holds on damaged items, we can stop right here
502
    # If an item is damaged and we don't allow holds on damaged items, we can stop right here
493
    return 0 if ( $item->{damaged} && !C4::Context->preference('AllowHoldsOnDamagedItems') );
503
    return 'damaged' if ( $item->{damaged} && !C4::Context->preference('AllowHoldsOnDamagedItems') );
494
504
495
    #Check for the age restriction
505
    #Check for the age restriction
496
    my ($ageRestriction, $daysToAgeRestriction) = C4::Circulation::GetAgeRestriction( $biblioData->{agerestriction}, $borrower );
506
    my ($ageRestriction, $daysToAgeRestriction) = C4::Circulation::GetAgeRestriction( $biblioData->{agerestriction}, $borrower );
497
    return 0 if $daysToAgeRestriction && $daysToAgeRestriction > 0;
507
    return 'ageRestricted' if $daysToAgeRestriction && $daysToAgeRestriction > 0;
498
508
499
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
509
    my $controlbranch = C4::Context->preference('ReservesControlBranch');
500
    my $itemtypefield = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype";
510
    my $itemtypefield = C4::Context->preference('item-level_itypes') ? "itype" : "itemtype";
Lines 561-567 sub CanItemBeReserved{ Link Here
561
    
571
    
562
    # we check if it's ok or not
572
    # we check if it's ok or not
563
    if( $reservecount >= $allowedreserves ){
573
    if( $reservecount >= $allowedreserves ){
564
        return 0;
574
        return 'tooManyReserves';
565
    }
575
    }
566
576
567
    # If reservecount is ok, we check item branch if IndependentBranches is ON
577
    # If reservecount is ok, we check item branch if IndependentBranches is ON
Lines 571-581 sub CanItemBeReserved{ Link Here
571
    {
581
    {
572
        my $itembranch = $item->{homebranch};
582
        my $itembranch = $item->{homebranch};
573
        if ($itembranch ne $borrower->{branchcode}) {
583
        if ($itembranch ne $borrower->{branchcode}) {
574
            return 0;
584
            return 'cannotReserveFromOtherBranches';
575
        }
585
        }
576
    }
586
    }
577
587
578
    return 1;
588
    return 'OK';
579
}
589
}
580
590
581
=head2 CanReserveBeCanceledFromOpac
591
=head2 CanReserveBeCanceledFromOpac
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/reserve/request.tt (-1 / +4 lines)
Lines 241-247 function checkMultiHold() { Link Here
241
    </form>
241
    </form>
242
  [% ELSE %]
242
  [% ELSE %]
243
243
244
[% IF ( maxreserves || alreadyreserved || none_available || alreadypossession ) %]
244
[% IF ( maxreserves || alreadyreserved || none_available || alreadypossession || ageRestricted ) %]
245
    <div class="dialog alert">
245
    <div class="dialog alert">
246
246
247
    [% UNLESS ( multi_hold ) %]
247
    [% UNLESS ( multi_hold ) %]
Lines 250-255 function checkMultiHold() { Link Here
250
        [% IF ( maxreserves ) %]
250
        [% IF ( maxreserves ) %]
251
          <li><strong>Too many holds: </strong> <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %] </a> has too many holds.</li>
251
          <li><strong>Too many holds: </strong> <a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %] </a> has too many holds.</li>
252
        [% END %]
252
        [% END %]
253
        [% IF ( ageRestricted ) %]
254
          <li><strong>Age restricted</strong></li>
255
        [% END %]
253
        [% IF ( alreadyreserved ) %]
256
        [% IF ( alreadyreserved ) %]
254
          <li><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %]</a> <strong>already has a hold</strong> on this item </li>
257
          <li><a href="/cgi-bin/koha/members/moremember.pl?borrowernumber=[% borrowernumber %]">[% borrowerfirstname %] [% borrowersurname %]</a> <strong>already has a hold</strong> on this item </li>
255
        [% END %]
258
        [% END %]
(-)a/koha-tmpl/opac-tmpl/bootstrap/en/modules/opac-reserve.tt (+3 lines)
Lines 143-148 Link Here
143
                                        </p>
143
                                        </p>
144
144
145
                                        [% UNLESS ( bibitemloo.holdable ) %]
145
                                        [% UNLESS ( bibitemloo.holdable ) %]
146
                                            [% IF ( bibitemloo.ageRestricted ) %]
147
                                                <div class="alert">Sorry, you are too young to reserve this material.</div>
148
                                            [% END %]
146
                                            [% IF ( bibitemloo.already_reserved ) %]
149
                                            [% IF ( bibitemloo.already_reserved ) %]
147
                                                <div class="alert">You have already requested this title.</div>
150
                                                <div class="alert">You have already requested this title.</div>
148
                                            [% ELSE %]
151
                                            [% ELSE %]
(-)a/opac/opac-reserve.pl (-6 / +11 lines)
Lines 252-258 if ( $query->param('place_reserve') ) { Link Here
252
      # holdingbranch, force the value $rank and $found.
252
      # holdingbranch, force the value $rank and $found.
253
        my $rank = $biblioData->{rank};
253
        my $rank = $biblioData->{rank};
254
        if ( $itemNum ne '' ) {
254
        if ( $itemNum ne '' ) {
255
            $canreserve = 1 if CanItemBeReserved( $borrowernumber, $itemNum );
255
            $canreserve = 1 if CanItemBeReserved( $borrowernumber, $itemNum ) eq 'OK';
256
            $rank = '0' unless C4::Context->preference('ReservesNeedReturns');
256
            $rank = '0' unless C4::Context->preference('ReservesNeedReturns');
257
            my $item = GetItem($itemNum);
257
            my $item = GetItem($itemNum);
258
            if ( $item->{'holdingbranch'} eq $branch ) {
258
            if ( $item->{'holdingbranch'} eq $branch ) {
Lines 261-267 if ( $query->param('place_reserve') ) { Link Here
261
            }
261
            }
262
        }
262
        }
263
        else {
263
        else {
264
            $canreserve = 1 if CanBookBeReserved( $borrowernumber, $biblioNum );
264
            $canreserve = 1 if CanBookBeReserved( $borrowernumber, $biblioNum ) eq 'OK';
265
265
266
            # Inserts a null into the 'itemnumber' field of 'reserves' table.
266
            # Inserts a null into the 'itemnumber' field of 'reserves' table.
267
            $itemNum = undef;
267
            $itemNum = undef;
Lines 524-530 foreach my $biblioNum (@biblionumbers) { Link Here
524
            $policy_holdallowed = 0;
524
            $policy_holdallowed = 0;
525
        }
525
        }
526
526
527
        if (IsAvailableForItemLevelRequest($itemNum) and $policy_holdallowed and CanItemBeReserved($borrowernumber,$itemNum) and ($itemLoopIter->{already_reserved} ne 1)) {
527
        if (IsAvailableForItemLevelRequest($itemNum) and $policy_holdallowed and CanItemBeReserved($borrowernumber,$itemNum) eq 'OK' and ($itemLoopIter->{already_reserved} ne 1)) {
528
            $itemLoopIter->{available} = 1;
528
            $itemLoopIter->{available} = 1;
529
            $numCopiesAvailable++;
529
            $numCopiesAvailable++;
530
        }
530
        }
Lines 548-556 foreach my $biblioNum (@biblionumbers) { Link Here
548
    if ($biblioLoopIter{already_reserved}) {
548
    if ($biblioLoopIter{already_reserved}) {
549
        $biblioLoopIter{holdable} = undef;
549
        $biblioLoopIter{holdable} = undef;
550
    }
550
    }
551
    if(not CanBookBeReserved($borrowernumber,$biblioNum)){
551
	my $canReserve = CanBookBeReserved($borrowernumber,$biblioNum);
552
        $biblioLoopIter{holdable} = undef;
552
	if ($canReserve eq 'OK') {
553
    }
553
		#All is OK!
554
	}
555
	else {
556
		$biblioLoopIter{holdable} = undef;
557
		$biblioLoopIter{ $canReserve } = 1;
558
	}
554
    if(not C4::Context->preference('AllowHoldsOnPatronsPossessions') and CheckIfIssuedToPatron($borrowernumber,$biblioNum)) {
559
    if(not C4::Context->preference('AllowHoldsOnPatronsPossessions') and CheckIfIssuedToPatron($borrowernumber,$biblioNum)) {
555
        $biblioLoopIter{holdable} = undef;
560
        $biblioLoopIter{holdable} = undef;
556
        $biblioLoopIter{already_patron_possession} = 1;
561
        $biblioLoopIter{already_patron_possession} = 1;
(-)a/reserve/request.pl (-3 / +14 lines)
Lines 191-199 foreach my $biblionumber (@biblionumbers) { Link Here
191
191
192
    my $dat = GetBiblioData($biblionumber);
192
    my $dat = GetBiblioData($biblionumber);
193
193
194
    unless ( CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber) ) {
194
	my $canReserve = CanBookBeReserved($borrowerinfo->{borrowernumber}, $biblionumber);
195
        $maxreserves = 1;
195
	if ($canReserve eq 'OK') {
196
		#All is OK and we can continue
197
	}
198
	elsif ( $canReserve eq 'tooManyReserves' ) {
199
		$maxreserves = 1;
196
    }
200
    }
201
	elsif ( $canReserve eq 'ageRestricted' ) {
202
		$template->param( $canReserve => 1 );
203
		$biblioloopiter{ $canReserve } = 1;
204
	}
205
	else {
206
		$biblioloopiter{ $canReserve } = 1;
207
	}
197
208
198
    my $alreadypossession;
209
    my $alreadypossession;
199
    if (not C4::Context->preference('AllowHoldsOnPatronsPossessions') and CheckIfIssuedToPatron($borrowerinfo->{borrowernumber},$biblionumber)) {
210
    if (not C4::Context->preference('AllowHoldsOnPatronsPossessions') and CheckIfIssuedToPatron($borrowerinfo->{borrowernumber},$biblionumber)) {
Lines 415-421 foreach my $biblionumber (@biblionumbers) { Link Here
415
                && IsAvailableForItemLevelRequest($itemnumber)
426
                && IsAvailableForItemLevelRequest($itemnumber)
416
                && CanItemBeReserved(
427
                && CanItemBeReserved(
417
                    $borrowerinfo->{borrowernumber}, $itemnumber
428
                    $borrowerinfo->{borrowernumber}, $itemnumber
418
                )
429
                ) eq 'OK'
419
              )
430
              )
420
            {
431
            {
421
                $item->{available} = 1;
432
                $item->{available} = 1;
(-)a/t/db_dependent/Holds.t (-8 / +8 lines)
Lines 210-216 t::lib::Mocks::mock_preference('item-level_itypes', 1); Link Here
210
# if IndependentBranches is OFF, a CPL patron can reserve an MPL item
210
# if IndependentBranches is OFF, a CPL patron can reserve an MPL item
211
t::lib::Mocks::mock_preference('IndependentBranches', 0);
211
t::lib::Mocks::mock_preference('IndependentBranches', 0);
212
ok(
212
ok(
213
    CanItemBeReserved($borrowernumbers[0], $foreign_itemnumber),
213
    CanItemBeReserved($borrowernumbers[0], $foreign_itemnumber) eq 'OK',
214
    'CPL patron allowed to reserve MPL item with IndependentBranches OFF (bug 2394)'
214
    'CPL patron allowed to reserve MPL item with IndependentBranches OFF (bug 2394)'
215
);
215
);
216
216
Lines 218-231 ok( Link Here
218
t::lib::Mocks::mock_preference('IndependentBranches', 1);
218
t::lib::Mocks::mock_preference('IndependentBranches', 1);
219
t::lib::Mocks::mock_preference('canreservefromotherbranches', 0);
219
t::lib::Mocks::mock_preference('canreservefromotherbranches', 0);
220
ok(
220
ok(
221
    ! CanItemBeReserved($borrowernumbers[0], $foreign_itemnumber),
221
    CanItemBeReserved($borrowernumbers[0], $foreign_itemnumber) eq 'cannotReserveFromOtherBranches',
222
    'CPL patron NOT allowed to reserve MPL item with IndependentBranches ON ... (bug 2394)'
222
    'CPL patron NOT allowed to reserve MPL item with IndependentBranches ON ... (bug 2394)'
223
);
223
);
224
224
225
# ... unless canreservefromotherbranches is ON
225
# ... unless canreservefromotherbranches is ON
226
t::lib::Mocks::mock_preference('canreservefromotherbranches', 1);
226
t::lib::Mocks::mock_preference('canreservefromotherbranches', 1);
227
ok(
227
ok(
228
    CanItemBeReserved($borrowernumbers[0], $foreign_itemnumber),
228
    CanItemBeReserved($borrowernumbers[0], $foreign_itemnumber) eq 'OK',
229
    '... unless canreservefromotherbranches is ON (bug 2394)'
229
    '... unless canreservefromotherbranches is ON (bug 2394)'
230
);
230
);
231
231
Lines 294-303 is( $reserve3->{priority}, 1, "After ModReserve, the 3rd reserve becomes the fir Link Here
294
294
295
ModItem({ damaged => 1 }, $item_bibnum, $itemnumber);
295
ModItem({ damaged => 1 }, $item_bibnum, $itemnumber);
296
C4::Context->set_preference( 'AllowHoldsOnDamagedItems', 1 );
296
C4::Context->set_preference( 'AllowHoldsOnDamagedItems', 1 );
297
ok( CanItemBeReserved( $borrowernumbers[0], $itemnumber), "Patron can reserve damaged item with AllowHoldsOnDamagedItems enabled" );
297
ok( CanItemBeReserved( $borrowernumbers[0], $itemnumber) eq 'OK', "Patron can reserve damaged item with AllowHoldsOnDamagedItems enabled" );
298
ok( defined( ( CheckReserves($itemnumber) )[1] ), "Hold can be trapped for damaged item with AllowHoldsOnDamagedItems enabled" );
298
ok( defined( ( CheckReserves($itemnumber) )[1] ), "Hold can be trapped for damaged item with AllowHoldsOnDamagedItems enabled" );
299
C4::Context->set_preference( 'AllowHoldsOnDamagedItems', 0 );
299
C4::Context->set_preference( 'AllowHoldsOnDamagedItems', 0 );
300
ok( !CanItemBeReserved( $borrowernumbers[0], $itemnumber), "Patron cannot reserve damaged item with AllowHoldsOnDamagedItems disabled" );
300
ok( CanItemBeReserved( $borrowernumbers[0], $itemnumber) eq 'damaged', "Patron cannot reserve damaged item with AllowHoldsOnDamagedItems disabled" );
301
ok( !defined( ( CheckReserves($itemnumber) )[1] ), "Hold cannot be trapped for damaged item with AllowHoldsOnDamagedItems disabled" );
301
ok( !defined( ( CheckReserves($itemnumber) )[1] ), "Hold cannot be trapped for damaged item with AllowHoldsOnDamagedItems disabled" );
302
302
303
# Regression test for bug 9532
303
# Regression test for bug 9532
Lines 312-330 AddReserve( Link Here
312
    1,
312
    1,
313
);
313
);
314
ok(
314
ok(
315
    !CanItemBeReserved( $borrowernumbers[0], $itemnumber),
315
    CanItemBeReserved( $borrowernumbers[0], $itemnumber) eq 'tooManyReserves',
316
    "cannot request item if policy that matches on item-level item type forbids it"
316
    "cannot request item if policy that matches on item-level item type forbids it"
317
);
317
);
318
ModItem({ itype => 'CAN' }, $item_bibnum, $itemnumber);
318
ModItem({ itype => 'CAN' }, $item_bibnum, $itemnumber);
319
ok(
319
ok(
320
    CanItemBeReserved( $borrowernumbers[0], $itemnumber),
320
    CanItemBeReserved( $borrowernumbers[0], $itemnumber) eq 'OK',
321
    "can request item if policy that matches on item type allows it"
321
    "can request item if policy that matches on item type allows it"
322
);
322
);
323
323
324
t::lib::Mocks::mock_preference('item-level_itypes', 0);
324
t::lib::Mocks::mock_preference('item-level_itypes', 0);
325
ModItem({ itype => undef }, $item_bibnum, $itemnumber);
325
ModItem({ itype => undef }, $item_bibnum, $itemnumber);
326
ok(
326
ok(
327
    !CanItemBeReserved( $borrowernumbers[0], $itemnumber),
327
    CanItemBeReserved( $borrowernumbers[0], $itemnumber) eq 'tooManyReserves',
328
    "cannot request item if policy that matches on bib-level item type forbids it (bug 9532)"
328
    "cannot request item if policy that matches on bib-level item type forbids it (bug 9532)"
329
);
329
);
330
330
(-)a/t/db_dependent/Reserves.t (-4 / +3 lines)
Lines 488-507 my ( $ageres_tagid, $ageres_subfieldid ) = GetMarcFromKohaField( "biblioitems.ag Link Here
488
$record->append_fields(  MARC::Field->new($ageres_tagid, '', '', $ageres_subfieldid => 'PEGI 16')  );
488
$record->append_fields(  MARC::Field->new($ageres_tagid, '', '', $ageres_subfieldid => 'PEGI 16')  );
489
C4::Biblio::ModBiblio( $record, $bibnum, '' );
489
C4::Biblio::ModBiblio( $record, $bibnum, '' );
490
490
491
is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 1, "Reserving an ageRestricted Biblio without a borrower dateofbirth succeeds" );
491
is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 'OK', "Reserving an ageRestricted Biblio without a borrower dateofbirth succeeds" );
492
492
493
#Set the dateofbirth for the Borrower making him "too young".
493
#Set the dateofbirth for the Borrower making him "too young".
494
my $now = DateTime->now();
494
my $now = DateTime->now();
495
C4::Members::SetAge( $borrower, '0015-00-00' );
495
C4::Members::SetAge( $borrower, '0015-00-00' );
496
C4::Members::ModMember( borrowernumber => $borrowernumber, dateofbirth => $borrower->{dateofbirth} );
496
C4::Members::ModMember( borrowernumber => $borrowernumber, dateofbirth => $borrower->{dateofbirth} );
497
497
498
is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 0, "Reserving a 'PEGI 16' Biblio by a 15 year old borrower fails");
498
is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 'ageRestricted', "Reserving a 'PEGI 16' Biblio by a 15 year old borrower fails");
499
499
500
#Set the dateofbirth for the Borrower making him "too old".
500
#Set the dateofbirth for the Borrower making him "too old".
501
C4::Members::SetAge( $borrower, '0030-00-00' );
501
C4::Members::SetAge( $borrower, '0030-00-00' );
502
C4::Members::ModMember( borrowernumber => $borrowernumber, dateofbirth => $borrower->{dateofbirth} );
502
C4::Members::ModMember( borrowernumber => $borrowernumber, dateofbirth => $borrower->{dateofbirth} );
503
503
504
is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 1, "Reserving a 'PEGI 16' Biblio by a 30 year old borrower succeeds");
504
is( C4::Reserves::CanBookBeReserved($borrowernumber, $biblionumber) , 'OK', "Reserving a 'PEGI 16' Biblio by a 30 year old borrower succeeds");
505
       ####
505
       ####
506
####### EO Bug 13113 <<<
506
####### EO Bug 13113 <<<
507
       ####
507
       ####
508
- 

Return to bug 13116