Bugzilla – Attachment 39681 Details for
Bug 6427
Rewrite of the accounts system
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 6427 - Unit Tests
Bug-6427---Unit-Tests.patch (text/plain), 16.86 KB, created by
Kyle M Hall (khall)
on 2015-05-29 11:35:27 UTC
(
hide
)
Description:
Bug 6427 - Unit Tests
Filename:
MIME Type:
Creator:
Kyle M Hall (khall)
Created:
2015-05-29 11:35:27 UTC
Size:
16.86 KB
patch
obsolete
>From e4bb0ea910d1723351c44921b8e783c0e67f392f Mon Sep 17 00:00:00 2001 >From: Kyle M Hall <kyle@bywatersolutions.com> >Date: Tue, 15 Jul 2014 10:56:39 -0400 >Subject: [PATCH] Bug 6427 - Unit Tests > >Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com> > >Signed-off-by: Sean McGarvey <seanm@pascolibraries.org> >--- > t/db_dependent/Accounts.t | 331 ++++++++++++---------- > t/db_dependent/Circulation.t | 36 ++- > t/db_dependent/Members/AddEnrolmentFeeIfNeeded.t | 6 +- > 3 files changed, 211 insertions(+), 162 deletions(-) > >diff --git a/t/db_dependent/Accounts.t b/t/db_dependent/Accounts.t >index a167f02..4351e7e 100644 >--- a/t/db_dependent/Accounts.t >+++ b/t/db_dependent/Accounts.t >@@ -19,165 +19,198 @@ > use strict; > use warnings; > >-use Test::More tests => 15; >-use Test::Warn; >+use Test::More tests => 19; >+ >+use C4::Context; >+ >+my $dbh = C4::Context->dbh; >+$dbh->{RaiseError}=1; >+$dbh->{AutoCommit}=0; > > BEGIN { >- use_ok('C4::Accounts'); >- use_ok('Koha::Object'); >- use_ok('Koha::Borrower'); >- use_ok('Data::Dumper'); >+ use_ok('Koha::Database'); >+ use_ok('Koha::Accounts'); >+ use_ok('Koha::Accounts::DebitTypes'); >+ use_ok('Koha::Accounts::CreditTypes'); > } > >-can_ok( 'C4::Accounts', >- qw( recordpayment >- makepayment >- getnextacctno >+## Intial Setup ## >+my $borrower = Koha::Database->new()->schema->resultset('Borrower')->create( >+ { >+ surname => 'Test', >+ categorycode => 'S', >+ branchcode => 'MPL', >+ account_balance => 0, >+ } >+); > >- chargelostitem >- manualinvoice >- getcharges >- ModNote >- getcredits >- getrefunds >- ReversePayment >- recordpayment_selectaccts >- makepartialpayment >- WriteOffFee ) >+my $biblio = >+ Koha::Database->new()->schema->resultset('Biblio') >+ ->create( { title => "Test Record" } ); >+my $biblioitem = >+ Koha::Database->new()->schema->resultset('Biblioitem') >+ ->create( { biblionumber => $biblio->biblionumber() } ); >+my $item = Koha::Database->new()->schema->resultset('Item')->create( >+ { >+ biblionumber => $biblio->biblionumber(), >+ biblioitemnumber => $biblioitem->biblioitemnumber(), >+ replacementprice => 25.00, >+ barcode => q{TEST_ITEM_BARCODE} >+ } > ); > >-my $dbh = C4::Context->dbh; >-$dbh->{RaiseError}=1; >-$dbh->{AutoCommit}=0; >-$dbh->do(q|DELETE FROM accountlines|); >-$dbh->do(q|DELETE FROM borrowers|); >-$dbh->do(q|DELETE FROM issues|); >- >-# Mock userenv >-local $SIG{__WARN__} = sub { warn $_[0] unless $_[0] =~ /redefined/ }; >-my $userenv; >-*C4::Context::userenv = \&Mock_userenv; >-$userenv = { flags => 1, id => 'my_userid', branch => 'CPL' }; >- >-# A Borrower for the tests ---------------------- >-my $categorycode = Koha::Database->new()->schema()->resultset('Category')->first()->categorycode(); >-my $branchcode = Koha::Database->new()->schema()->resultset('Branch')->first()->branchcode(); >- >-my $borrower = Koha::Borrower->new( { >- cardnumber => '1234567890', >- surname => 'McFly', >- firstname => 'Marty', >-} ); >-$borrower->categorycode( $categorycode ); >-$borrower->branchcode( $branchcode ); >-$borrower->store; >- >-my $sth = $dbh->prepare( >- "INSERT INTO accountlines ( >- borrowernumber, >- amountoutstanding ) >- VALUES ( ?, ? )" >-); >-$sth->execute($borrower->borrowernumber, '100'); >-$sth->execute($borrower->borrowernumber, '200'); >- >-$sth = $dbh->prepare("SELECT count(*) FROM accountlines"); >-$sth->execute; >-my $count = $sth->fetchrow_array; >-is ($count, 2, 'There is 2 lines as expected'); >- >-# Testing recordpayment ------------------------- >-# There is $100 in the account >-$sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); >-my $amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); >-my $amountleft = 0; >-for my $line ( @$amountoutstanding ) { >- $amountleft += $line; >-} >-ok($amountleft == 300, 'The account has 300$ as expected' ); >- >-# We make a $20 payment >-my $borrowernumber = $borrower->borrowernumber; >-my $data = '20.00'; >-my $sys_paytype; >-my $payment_note = '$20.00 payment note'; >-recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); >-# There is now $280 in the account >-$sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); >-$amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); >-$amountleft = 0; >-for my $line ( @$amountoutstanding ) { >- $amountleft += $line; >-} >-ok($amountleft == 280, 'The account has $280 as expected' ); >-# Is the payment note well registered >-$sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); >-$sth->execute($borrower->borrowernumber); >-my $note = $sth->fetchrow_array; >-is($note,'$20.00 payment note', '$20.00 payment note is registered'); >- >-# We make a -$30 payment (a NEGATIVE payment) >-$data = '-30.00'; >-$payment_note = '-$30.00 payment note'; >-recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); >-# There is now $310 in the account >-$sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); >-$amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); >-$amountleft = 0; >-for my $line ( @$amountoutstanding ) { >- $amountleft += $line; >-} >-ok($amountleft == 310, 'The account has $310 as expected' ); >-# Is the payment note well registered >-$sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); >-$sth->execute($borrower->borrowernumber); >-$note = $sth->fetchrow_array; >-is($note,'-$30.00 payment note', '-$30.00 payment note is registered'); >- >-#We make a $150 payment ( > 1stLine ) >-$data = '150.00'; >-$payment_note = '$150.00 payment note'; >-recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); >-# There is now $160 in the account >-$sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); >-$amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); >-$amountleft = 0; >-for my $line ( @$amountoutstanding ) { >- $amountleft += $line; >-} >-ok($amountleft == 160, 'The account has $160 as expected' ); >-# Is the payment note well registered >-$sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); >-$sth->execute($borrower->borrowernumber); >-$note = $sth->fetchrow_array; >-is($note,'$150.00 payment note', '$150.00 payment note is registered'); >- >-#We make a $200 payment ( > amountleft ) >-$data = '200.00'; >-$payment_note = '$200.00 payment note'; >-recordpayment($borrowernumber, $data, $sys_paytype, $payment_note); >-# There is now -$40 in the account >-$sth = $dbh->prepare("SELECT amountoutstanding FROM accountlines WHERE borrowernumber=?"); >-$amountoutstanding = $dbh->selectcol_arrayref($sth, {}, $borrower->borrowernumber); >-$amountleft = 0; >-for my $line ( @$amountoutstanding ) { >- $amountleft += $line; >-} >-ok($amountleft == -40, 'The account has -$40 as expected, (credit situation)' ); >-# Is the payment note well registered >-$sth = $dbh->prepare("SELECT note FROM accountlines WHERE borrowernumber=? ORDER BY accountlines_id DESC LIMIT 1"); >-$sth->execute($borrower->borrowernumber); >-$note = $sth->fetchrow_array; >-is($note,'$200.00 payment note', '$200.00 payment note is registered'); >+my $issue = Koha::Database->new()->schema->resultset('Issue')->create( >+ { >+ borrowernumber => $borrower->borrowernumber(), >+ itemnumber => $item->itemnumber(), >+ } >+); >+## END initial setup > >+ok( Koha::Accounts::DebitTypes::Fine eq 'FINE', 'Test DebitTypes::Fine' ); >+ok( Koha::Accounts::DebitTypes::Lost eq 'LOST', 'Test DebitTypes::Lost' ); >+ok( >+ Koha::Accounts::DebitTypes::IsValid('FINE'), >+ 'Test DebitTypes::IsValid with valid debit type' >+); >+ok( >+ !Koha::Accounts::DebitTypes::IsValid('Not A Valid Fee Type'), >+ 'Test DebitTypes::IsValid with an invalid debit type' >+); >+my $authorised_value = >+ Koha::Database->new()->schema->resultset('AuthorisedValue')->create( >+ { >+ category => 'MANUAL_INV', >+ authorised_value => 'TEST', >+ lib => 'Test', >+ } >+ ); >+ok( Koha::Accounts::DebitTypes::IsValid('TEST'), >+ 'Test DebitTypes::IsValid with valid authorised value debit type' ); >+$authorised_value->delete(); >+ >+my $debit = AddDebit( >+ { >+ borrower => $borrower, >+ amount => 5.00, >+ type => Koha::Accounts::DebitTypes::Fine, >+ branchcode => 'MPL', >+ } >+); >+ok( $debit, "AddDebit returned a valid debit id " . $debit->id() ); > >+ok( >+ $borrower->account_balance() == 5.00, >+ "Borrower's account balance updated correctly. Should be 5.00, is " . $borrower->account_balance() >+); > >-$dbh->rollback; >+my $debit2 = AddDebit( >+ { >+ borrower => $borrower, >+ amount => 7.00, >+ type => Koha::Accounts::DebitTypes::Fine, >+ branchcode => 'MPL', >+ } >+); >+ >+my $credit = AddCredit( >+ { >+ borrower => $borrower, >+ type => Koha::Accounts::CreditTypes::Payment, >+ amount => 9.00, >+ branchcode => 'MPL', >+ } >+); >+ >+RecalculateAccountBalance( { borrower => $borrower } ); >+ok( >+ sprintf( "%.2f", $borrower->account_balance() ) eq "3.00", >+ "RecalculateAccountBalance updated balance correctly." >+); >+ >+Koha::Database->new()->schema->resultset('AccountCredit')->create( >+ { >+ borrowernumber => $borrower->borrowernumber(), >+ type => Koha::Accounts::CreditTypes::Payment, >+ amount_paid => 3.00, >+ amount_remaining => 3.00, >+ } >+); >+NormalizeBalances( { borrower => $borrower } ); >+ok( >+ $borrower->account_balance() == 0.00, >+ "NormalizeBalances updated balance correctly." >+); >+ >+# Adding advance credit with no balance due >+$credit = AddCredit( >+ { >+ borrower => $borrower, >+ type => Koha::Accounts::CreditTypes::Payment, >+ amount => 9.00, >+ branchcode => 'MPL', >+ } >+); >+ok( >+ $borrower->account_balance() == -9, >+'Adding a $9 credit for borrower with 0 balance results in a -9 dollar account balance' >+); > >+my $debit3 = AddDebit( >+ { >+ borrower => $borrower, >+ amount => 5.00, >+ type => Koha::Accounts::DebitTypes::Fine, >+ branchcode => 'MPL', >+ } >+); >+ok( >+ $borrower->account_balance() == -4, >+'Adding a $5 debit when the balance is negative results in the debit being automatically paid, resulting in a balance of -4' >+); > >-# Sub ------------------------------------------- >+my $debit4 = AddDebit( >+ { >+ borrower => $borrower, >+ amount => 6.00, >+ type => Koha::Accounts::DebitTypes::Fine, >+ branchcode => 'MPL', >+ } >+); >+ok( >+ $borrower->account_balance() == 2, >+'Adding another debit ( 6.00 ) more than the negative account balance results in a partial credit and a balance due of 2.00' >+); >+$credit = AddCredit( >+ { >+ borrower => $borrower, >+ type => Koha::Accounts::CreditTypes::WriteOff, >+ amount => 2.00, >+ branchcode => 'MPL', >+ debit_id => $debit4->debit_id(), >+ } >+); >+ok( $borrower->account_balance() == 0, >+ 'WriteOff of remaining 2.00 balance succeeds' ); >+ >+my $debit5 = DebitLostItem( >+ { >+ borrower => $borrower, >+ issue => $issue, >+ } >+); >+ok( $borrower->account_balance() == 25, >+ 'DebitLostItem adds debit for replacement price of item' ); >+ >+my $lost_credit = >+ CreditLostItem( { borrower => $borrower, debit => $debit5 } ); >+ok( >+ $borrower->account_balance() == 0, >+ 'CreditLostItem adds credit for same about as the debit for the lost tiem' >+); > >-# C4::Context->userenv >-sub Mock_userenv { >- return $userenv; >-} >\ No newline at end of file >+## Post test cleanup ## >+$issue->delete(); >+$item->delete(); >+$biblio->delete(); >+$borrower->delete(); >diff --git a/t/db_dependent/Circulation.t b/t/db_dependent/Circulation.t >index 30a5fe7..4084d87 100755 >--- a/t/db_dependent/Circulation.t >+++ b/t/db_dependent/Circulation.t >@@ -170,7 +170,7 @@ $dbh->do( > ); > > # Test C4::Circulation::ProcessOfflinePayment >-my $sth = C4::Context->dbh->prepare("SELECT COUNT(*) FROM accountlines WHERE amount = '-123.45' AND accounttype = 'Pay'"); >+my $sth = C4::Context->dbh->prepare("SELECT COUNT(*) FROM account_credits WHERE amount_paid = '123.45' AND type = 'PAYMENT'"); > $sth->execute(); > my ( $original_count ) = $sth->fetchrow_array(); > >@@ -183,9 +183,9 @@ my ( $new_count ) = $sth->fetchrow_array(); > > ok( $new_count == $original_count + 1, 'ProcessOfflinePayment makes payment correctly' ); > >-C4::Context->dbh->do("DELETE FROM accountlines WHERE borrowernumber IN ( SELECT borrowernumber FROM borrowers WHERE cardnumber = '99999999999' )"); >+C4::Context->dbh->do("DELETE FROM account_credits"); >+C4::Context->dbh->do("DELETE FROM account_debits"); > C4::Context->dbh->do("DELETE FROM borrowers WHERE cardnumber = '99999999999'"); >-C4::Context->dbh->do("DELETE FROM accountlines"); > { > # CanBookBeRenewed tests > >@@ -429,8 +429,15 @@ C4::Context->dbh->do("DELETE FROM accountlines"); > C4::Context->set_preference('WhenLostForgiveFine','1'); > C4::Context->set_preference('WhenLostChargeReplacementFee','1'); > >- C4::Overdues::UpdateFine( $itemnumber, $renewing_borrower->{borrowernumber}, >- 15.00, q{}, Koha::DateUtils::output_pref($datedue) ); >+ C4::Overdues::UpdateFine( >+ { >+ itemnumber => $itemnumber, >+ borrowernumber => $renewing_borrower->{borrowernumber}, >+ amount => 15.00, >+ due => Koha::DateUtils::output_pref($datedue), >+ issue_id => GetItemIssue($itemnumber)->{issue_id} >+ } >+ ); > > LostItem( $itemnumber, 1 ); > >@@ -438,19 +445,28 @@ C4::Context->dbh->do("DELETE FROM accountlines"); > ok( !$item->onloan(), "Lost item marked as returned has false onloan value" ); > > my $total_due = $dbh->selectrow_array( >- 'SELECT SUM( amountoutstanding ) FROM accountlines WHERE borrowernumber = ?', >+ 'SELECT account_balance FROM borrowers WHERE borrowernumber = ?', > undef, $renewing_borrower->{borrowernumber} > ); > > ok( $total_due == 12, 'Borrower only charged replacement fee with both WhenLostForgiveFine and WhenLostChargeReplacementFee enabled' ); > >- C4::Context->dbh->do("DELETE FROM accountlines"); >+ C4::Context->dbh->do("DELETE FROM account_credits"); >+ C4::Context->dbh->do("DELETE FROM account_debits"); >+ C4::Context->dbh->do("UPDATE borrowers SET account_balance = 0"); > > C4::Context->set_preference('WhenLostForgiveFine','0'); > C4::Context->set_preference('WhenLostChargeReplacementFee','0'); > >- C4::Overdues::UpdateFine( $itemnumber2, $renewing_borrower->{borrowernumber}, >- 15.00, q{}, Koha::DateUtils::output_pref($datedue) ); >+ C4::Overdues::UpdateFine( >+ { >+ itemnumber => $itemnumber2, >+ borrowernumber => $renewing_borrower->{borrowernumber}, >+ amount => 15.00, >+ due => Koha::DateUtils::output_pref($datedue), >+ issue_id => GetItemIssue($itemnumber2)->{issue_id}, >+ } >+ ); > > LostItem( $itemnumber2, 0 ); > >@@ -458,7 +474,7 @@ C4::Context->dbh->do("DELETE FROM accountlines"); > ok( $item2->onloan(), "Lost item *not* marked as returned has true onloan value" ); > > $total_due = $dbh->selectrow_array( >- 'SELECT SUM( amountoutstanding ) FROM accountlines WHERE borrowernumber = ?', >+ 'SELECT account_balance FROM borrowers WHERE borrowernumber = ?', > undef, $renewing_borrower->{borrowernumber} > ); > >diff --git a/t/db_dependent/Members/AddEnrolmentFeeIfNeeded.t b/t/db_dependent/Members/AddEnrolmentFeeIfNeeded.t >index 46d9ec1..b8f0708 100644 >--- a/t/db_dependent/Members/AddEnrolmentFeeIfNeeded.t >+++ b/t/db_dependent/Members/AddEnrolmentFeeIfNeeded.t >@@ -40,17 +40,17 @@ my %borrower_data = ( > my $borrowernumber = C4::Members::AddMember( %borrower_data ); > $borrower_data{borrowernumber} = $borrowernumber; > >-my ( $total ) = C4::Members::GetMemberAccountRecords( $borrowernumber ); >+my ( $total ) = C4::Members::GetMemberAccountBalance( $borrowernumber ); > is( $total, $enrolmentfee_K, "New kid pay $enrolmentfee_K" ); > > $borrower_data{categorycode} = 'J'; > C4::Members::ModMember( %borrower_data ); >-( $total ) = C4::Members::GetMemberAccountRecords( $borrowernumber ); >+( $total ) = C4::Members::GetMemberAccountBalance( $borrowernumber ); > is( $total, $enrolmentfee_K + $enrolmentfee_J, "Kid growing and become a juvenile, he should pay " . ( $enrolmentfee_K + $enrolmentfee_J ) ); > > # Check with calling directly AddEnrolmentFeeIfNeeded > C4::Members::AddEnrolmentFeeIfNeeded( 'YA', $borrowernumber ); >-( $total ) = C4::Members::GetMemberAccountRecords( $borrowernumber ); >+( $total ) = C4::Members::GetMemberAccountBalance( $borrowernumber ); > is( $total, $enrolmentfee_K + $enrolmentfee_J + $enrolmentfee_YA, "Juvenile growing and become an young adult, he should pay " . ( $enrolmentfee_K + $enrolmentfee_J + $enrolmentfee_YA ) ); > > $dbh->rollback; >-- >1.7.2.5
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 6427
:
21922
|
22704
|
22705
|
22708
|
22709
|
22710
|
22741
|
22870
|
22871
|
22872
|
22873
|
22874
|
22875
|
22876
|
22881
|
22889
|
22940
|
22948
|
22949
|
22995
|
23000
|
23137
|
23158
|
23161
|
23171
|
23186
|
23269
|
23275
|
23276
|
23391
|
23392
|
23400
|
23401
|
23402
|
23403
|
23404
|
23405
|
23406
|
23407
|
23408
|
23409
|
23410
|
23411
|
23412
|
23413
|
23420
|
23421
|
23422
|
23423
|
23424
|
23425
|
23426
|
23427
|
23428
|
23429
|
23430
|
23431
|
23432
|
23433
|
23440
|
23441
|
23442
|
23443
|
23444
|
23445
|
23446
|
23447
|
23448
|
23449
|
23450
|
23451
|
23452
|
23453
|
23454
|
23458
|
23459
|
23460
|
23461
|
23462
|
23463
|
23464
|
23465
|
23466
|
23467
|
23468
|
23469
|
23470
|
23471
|
23603
|
23643
|
23644
|
23645
|
23646
|
23647
|
23648
|
23649
|
23650
|
23651
|
23652
|
23653
|
23654
|
23655
|
23656
|
23657
|
23937
|
23938
|
23939
|
23940
|
23941
|
23942
|
23943
|
23944
|
23945
|
23946
|
23947
|
23948
|
23949
|
23950
|
23951
|
24612
|
24613
|
24614
|
24615
|
24616
|
24617
|
24618
|
24619
|
24620
|
24621
|
24622
|
24623
|
24624
|
24625
|
24626
|
24627
|
24628
|
24757
|
24758
|
24759
|
24760
|
24761
|
24762
|
24763
|
24764
|
24765
|
24766
|
24767
|
24768
|
24769
|
24770
|
24771
|
24772
|
24777
|
24792
|
24793
|
24794
|
24795
|
24796
|
24797
|
24798
|
24799
|
24800
|
24801
|
24802
|
24803
|
24804
|
24805
|
24806
|
24807
|
24808
|
24809
|
24810
|
24811
|
24812
|
24813
|
24814
|
24815
|
24816
|
24817
|
24818
|
24819
|
24820
|
24821
|
24822
|
24823
|
24824
|
24825
|
24826
|
24827
|
24828
|
24829
|
24830
|
24831
|
24832
|
24833
|
24834
|
24835
|
24836
|
24837
|
24838
|
24839
|
24840
|
24841
|
24842
|
24843
|
24844
|
25777
|
25778
|
25779
|
25780
|
25781
|
25782
|
25783
|
25784
|
25785
|
25786
|
25787
|
25788
|
25789
|
25790
|
25791
|
25792
|
25793
|
25794
|
25795
|
25796
|
25797
|
25798
|
25799
|
25800
|
25801
|
25802
|
25803
|
25804
|
25805
|
25806
|
25807
|
25808
|
25809
|
25810
|
25811
|
25812
|
25813
|
25814
|
25815
|
25816
|
25930
|
25932
|
25933
|
25934
|
26033
|
26034
|
26035
|
26036
|
26107
|
27167
|
27168
|
27169
|
27170
|
27171
|
27172
|
27173
|
27174
|
27175
|
27176
|
27177
|
27178
|
27179
|
27180
|
27181
|
27182
|
27183
|
27184
|
27185
|
27186
|
27187
|
27189
|
27190
|
27197
|
28067
|
28068
|
28069
|
28070
|
28071
|
28072
|
28073
|
28074
|
28075
|
28076
|
28077
|
28078
|
28079
|
28080
|
28081
|
28082
|
28083
|
28084
|
28085
|
28086
|
28087
|
28088
|
28089
|
28090
|
28091
|
28527
|
28528
|
28529
|
28530
|
28531
|
28532
|
28533
|
28534
|
28535
|
28536
|
28537
|
28538
|
28539
|
28540
|
28541
|
28542
|
28543
|
28544
|
28545
|
28546
|
28547
|
28548
|
28549
|
28550
|
28551
|
28552
|
28553
|
28555
|
28556
|
28561
|
28563
|
28564
|
28795
|
28796
|
28797
|
28798
|
28799
|
28800
|
28801
|
28802
|
28803
|
28804
|
28805
|
28806
|
28807
|
28808
|
28809
|
28810
|
28811
|
28812
|
28813
|
28814
|
28815
|
28816
|
28817
|
28818
|
28819
|
28820
|
28821
|
28822
|
28887
|
28888
|
28889
|
28890
|
28909
|
29176
|
29230
|
29231
|
29232
|
29233
|
29234
|
29235
|
29236
|
29237
|
29238
|
29239
|
29240
|
29241
|
29242
|
29243
|
29244
|
29245
|
29246
|
29247
|
29248
|
29249
|
29250
|
29251
|
29252
|
29253
|
29254
|
29255
|
29256
|
29257
|
29258
|
29259
|
29260
|
29261
|
29262
|
29263
|
29264
|
29265
|
29706
|
29707
|
29708
|
29709
|
29710
|
29711
|
29712
|
29713
|
29714
|
29715
|
29716
|
29717
|
29719
|
29720
|
29721
|
29722
|
29723
|
29724
|
29725
|
29726
|
29727
|
29728
|
29729
|
29730
|
30271
|
30272
|
30273
|
30274
|
30275
|
30276
|
30277
|
30278
|
30279
|
30280
|
30281
|
30282
|
30320
|
30321
|
30322
|
30323
|
30324
|
30325
|
30326
|
30327
|
30328
|
30329
|
30330
|
30331
|
30416
|
30417
|
30418
|
30419
|
30420
|
30421
|
30422
|
30423
|
30424
|
30425
|
30426
|
30427
|
31477
|
31478
|
31479
|
31480
|
31481
|
31482
|
31483
|
31484
|
31485
|
31486
|
31487
|
31488
|
31754
|
31755
|
31756
|
31757
|
31758
|
31759
|
31760
|
31761
|
31762
|
31763
|
31764
|
31765
|
31766
|
31767
|
31768
|
31769
|
31770
|
31771
|
31772
|
31773
|
31774
|
31775
|
31776
|
31777
|
32478
|
32479
|
32480
|
32481
|
32482
|
32483
|
32484
|
32485
|
32486
|
32487
|
32488
|
32489
|
32591
|
32592
|
32593
|
32594
|
32595
|
32596
|
32597
|
32598
|
32599
|
32600
|
32601
|
32602
|
32827
|
32828
|
32829
|
32830
|
32831
|
32832
|
32833
|
32834
|
32835
|
32836
|
32837
|
32838
|
33251
|
33252
|
33253
|
33254
|
33255
|
33256
|
33257
|
33258
|
33259
|
33260
|
33261
|
33262
|
34096
|
34097
|
34098
|
34099
|
34100
|
34101
|
34102
|
34103
|
34104
|
34105
|
34106
|
34107
|
34204
|
34205
|
34206
|
34207
|
34208
|
34209
|
34210
|
34211
|
34212
|
34213
|
34214
|
34215
|
35196
|
35197
|
35198
|
35199
|
35200
|
35201
|
35202
|
35203
|
35204
|
35205
|
35206
|
35207
|
35208
|
35302
|
36324
|
36326
|
36327
|
36328
|
36329
|
36330
|
36331
|
36332
|
36333
|
36334
|
36335
|
36337
|
36338
|
36340
|
36380
|
36391
|
36393
|
37127
|
37128
|
37129
|
37130
|
37131
|
37133
|
37134
|
37135
|
37136
|
37137
|
37138
|
37139
|
37140
|
37141
|
37142
|
37143
|
37147
|
37148
|
37149
|
37150
|
37151
|
37152
|
37153
|
37154
|
37155
|
37156
|
37157
|
37158
|
37159
|
37160
|
37161
|
37162
|
37229
|
37230
|
37231
|
37232
|
37233
|
37234
|
37235
|
37236
|
37237
|
37238
|
37239
|
37240
|
37241
|
37242
|
37243
|
37244
|
38247
|
38248
|
38249
|
38250
|
38251
|
38252
|
38253
|
38254
|
38255
|
38256
|
38257
|
38258
|
38259
|
38260
|
38261
|
38262
|
39063
|
39064
|
39065
|
39066
|
39067
|
39069
|
39070
|
39071
|
39072
|
39073
|
39074
|
39075
|
39076
|
39077
|
39078
|
39079
|
39671
|
39672
|
39673
|
39674
|
39675
|
39676
|
39677
|
39678
|
39679
|
39680
| 39681 |
39682
|
39683
|
39684
|
39685
|
39686