From adccedc02fea78dd5a924605d254ea709d63473b Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Sun, 7 Jul 2013 16:29:28 -0400 Subject: [PATCH] Allow numeric range to be omitted qpdf --pages Detect a missing page range and assume 1-z. --- ChangeLog | 8 + manual/qpdf-manual.xml | 11 +- qpdf/qpdf.cc | 61 ++- qpdf/qpdf.testcov | 2 + qpdf/qtest/qpdf.test | 12 +- qpdf/qtest/qpdf/merge-implicit-ranges.pdf | 628 ++++++++++++++++++++++ 6 files changed, 714 insertions(+), 8 deletions(-) create mode 100644 qpdf/qtest/qpdf/merge-implicit-ranges.pdf diff --git a/ChangeLog b/ChangeLog index 88665a0c..aab42fea 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +2013-07-07 Jay Berkenbilt + + * qpdf: allow omission of range in --pages. If range is omitted + such that an argument that is supposed to be a range is an invalid + range and a valid file name, the range of 1-z is assumed. This + makes it possible to merge a bunch of files with something like + qpdf --empty out.pdf --pages *.pdf -- + 2013-06-15 Jay Berkenbilt * Handle some additional broken files with missing /ID in trailer diff --git a/manual/qpdf-manual.xml b/manual/qpdf-manual.xml index ac0d32cc..b5748c24 100644 --- a/manual/qpdf-manual.xml +++ b/manual/qpdf-manual.xml @@ -614,7 +614,7 @@ make file is given as the primary input file is used as the starting point, but its pages are replaced with pages as specified. - + Multiple input files may be specified. Each one is given as the name of the input file, an optional password (if required to open @@ -635,6 +635,15 @@ make input file. To discard these, use as the primary input. + + Starting with qpdf 4.2.0, it is possible to omit the page range. + If qpdf sees a value in the place where it expects a page range + and that value is not a valid range but is a valid file name, qpdf + will implicitly use the range 1-z, meaning that + it will include all pages in the file. This makes it possible to + easily combine all pages in a set of files with a command like + qpdf --empty out.pdf --pages *.pdf --. + It is not presently possible to specify the same page from the same file directly more than once, but you can make this work by diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index 39a536d9..a2e165fb 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -163,7 +163,7 @@ These options allow pages to be selected from one or more PDF files.\n\ Whatever file is given as the primary input file is used as the\n\ starting point, but its pages are replaced with pages as specified.\n\ \n\ ---pages file [ --password=password ] page-range ... --\n\ +--pages file [ --password=password ] [ page-range ] ... --\n\ \n\ For each file that pages should be taken from, specify the file, a\n\ password needed to open the file (if any), and a page range. The\n\ @@ -183,6 +183,10 @@ pages to appear in reverse. Repeating a number will cause an error, but\n\ the manual discusses a workaround should you really want to include the\n\ same page twice.\n\ \n\ +If the page range is omitted, the range of 1-z is assumed. qpdf decides\n\ +that the page range is omitted if the range argument is either -- or a\n\ +valid file name and not a valid range.\n\ +\n\ See the manual for examples and a discussion of additional subtleties.\n\ \n\ \n\ @@ -354,7 +358,8 @@ static void show_encryption(QPDF& pdf) } } -static std::vector parse_numrange(char const* range, int max) +static std::vector parse_numrange(char const* range, int max, + bool throw_error = false) { std::vector result; char const* p = range; @@ -436,7 +441,9 @@ static std::vector parse_numrange(char const* range, int max) for (size_t i = 0; i < work.size(); i += 2) { int num = work[i]; - if ((num < 1) || (num > max)) + // max == 0 means we don't know the max and are just + // testing for valid syntax. + if ((max > 0) && ((num < 1) || (num > max))) { throw std::runtime_error( "number " + QUtil::int_to_string(num) + " out of range"); @@ -480,6 +487,10 @@ static std::vector parse_numrange(char const* range, int max) } catch (std::runtime_error e) { + if (throw_error) + { + throw e; + } if (p) { usage("error at * in numeric range " + @@ -839,9 +850,9 @@ parse_pages_options( { usage("insufficient arguments to --pages"); } - char* file = argv[cur_arg++]; - char* password = 0; - char* range = argv[cur_arg++]; + char const* file = argv[cur_arg++]; + char const* password = 0; + char const* range = argv[cur_arg++]; if (strncmp(range, "--password=", 11) == 0) { // Oh, that's the password, not the range @@ -853,6 +864,44 @@ parse_pages_options( range = argv[cur_arg++]; } + // See if the user omitted the range entirely, in which case + // we assume "1-z". + bool range_omitted = false; + if (strcmp(range, "--") == 0) + { + // The filename or password was the last argument + QTC::TC("qpdf", "qpdf pages range omitted at end"); + range_omitted = true; + } + else + { + try + { + parse_numrange(range, 0, true); + } + catch (std::runtime_error& e1) + { + // The range is invalid. Let's see if it's a file. + try + { + fclose(QUtil::safe_fopen(range, "rb")); + // Yup, it's a file. + QTC::TC("qpdf", "qpdf pages range omitted in middle"); + range_omitted = true; + } + catch (std::runtime_error& e2) + { + // Ignore. The range is invalid and not a file. + // We'll get an error message later. + } + } + } + if (range_omitted) + { + --cur_arg; + range = "1-z"; + } + result.push_back(PageSpec(file, password, range)); } return result; diff --git a/qpdf/qpdf.testcov b/qpdf/qpdf.testcov index aaf2f2ff..a29ae284 100644 --- a/qpdf/qpdf.testcov +++ b/qpdf/qpdf.testcov @@ -265,3 +265,5 @@ QPDF not caching overridden objstm object 0 QPDFWriter original obj non-zero gen 0 QPDF_optimization indirect outlines 0 QPDF xref space 2 +qpdf pages range omitted at end 0 +qpdf pages range omitted in middle 0 diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index 5321ae85..3589944a 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -567,7 +567,7 @@ foreach my $d (@nrange_tests) show_ntests(); # ---------- $td->notify("--- Merging and Splitting ---"); -$n_tests += 6; +$n_tests += 8; # Select pages from the same file multiple times including selecting # twice from an encrypted file and specifying the password only the @@ -612,6 +612,16 @@ $td->runtest("avoid respecification of password", $td->runtest("check output", {$td->FILE => "a.pdf"}, {$td->FILE => "pages-copy-encryption.pdf"}); +$td->runtest("merge with implicit ranges", + {$td->COMMAND => + "qpdf --empty a.pdf" . + " --pages minimal.pdf 20-pages.pdf --password=user" . + " page-labels-and-outlines.pdf --" . + " --static-id"}, + {$td->STRING => "", $td->EXIT_STATUS => 0}); +$td->runtest("check output", + {$td->FILE => "a.pdf"}, + {$td->FILE => "merge-implicit-ranges.pdf"}); show_ntests(); # ---------- $td->notify("--- PDF From Scratch ---"); diff --git a/qpdf/qtest/qpdf/merge-implicit-ranges.pdf b/qpdf/qtest/qpdf/merge-implicit-ranges.pdf new file mode 100644 index 00000000..da523cad --- /dev/null +++ b/qpdf/qtest/qpdf/merge-implicit-ranges.pdf @@ -0,0 +1,628 @@ +%PDF-1.3 +% +1 0 obj +<< /Pages 2 0 R /Type /Catalog >> +endobj +2 0 obj +<< /Count 51 /Kids [ 3 0 R 4 0 R 5 0 R 6 0 R 7 0 R 8 0 R 9 0 R 10 0 R 11 0 R 12 0 R 13 0 R 14 0 R 15 0 R 16 0 R 17 0 R 18 0 R 19 0 R 20 0 R 21 0 R 22 0 R 23 0 R 24 0 R 25 0 R 26 0 R 27 0 R 28 0 R 29 0 R 30 0 R 31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R 41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R 51 0 R 52 0 R 53 0 R ] /Type /Pages >> +endobj +3 0 obj +<< /Contents 54 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 55 0 R >> /ProcSet 56 0 R >> /Type /Page >> +endobj +4 0 obj +<< /Contents 57 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +5 0 obj +<< /Contents 59 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +6 0 obj +<< /Contents 60 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +7 0 obj +<< /Contents 61 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +8 0 obj +<< /Contents 62 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +9 0 obj +<< /Contents 63 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +10 0 obj +<< /Contents 64 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +11 0 obj +<< /Contents 65 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +12 0 obj +<< /Contents 66 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +13 0 obj +<< /Contents 67 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +14 0 obj +<< /Contents 68 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +15 0 obj +<< /Contents 69 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +16 0 obj +<< /Contents 70 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +17 0 obj +<< /Contents 71 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +18 0 obj +<< /Contents 72 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +19 0 obj +<< /Contents 73 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +20 0 obj +<< /Contents 74 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +21 0 obj +<< /Contents 75 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +22 0 obj +<< /Contents 76 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +23 0 obj +<< /Contents 77 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 58 0 R >> /ProcSet [ /PDF /Text ] >> /Type /Page >> +endobj +24 0 obj +<< /Contents 78 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +25 0 obj +<< /Contents 81 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +26 0 obj +<< /Contents 82 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +27 0 obj +<< /Contents 83 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +28 0 obj +<< /Contents 84 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +29 0 obj +<< /Contents 85 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +30 0 obj +<< /Contents 86 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +31 0 obj +<< /Contents 87 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +32 0 obj +<< /Contents 88 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +33 0 obj +<< /Contents 89 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +34 0 obj +<< /Contents 90 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +35 0 obj +<< /Contents 91 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +36 0 obj +<< /Contents 92 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +37 0 obj +<< /Contents 93 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +38 0 obj +<< /Contents 94 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +39 0 obj +<< /Contents 95 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +40 0 obj +<< /Contents 96 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +41 0 obj +<< /Contents 97 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +42 0 obj +<< /Contents 98 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +43 0 obj +<< /Contents 99 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +44 0 obj +<< /Contents 100 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +45 0 obj +<< /Contents 101 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +46 0 obj +<< /Contents 102 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +47 0 obj +<< /Contents 103 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +48 0 obj +<< /Contents 104 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +49 0 obj +<< /Contents 105 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +50 0 obj +<< /Contents 106 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +51 0 obj +<< /Contents 107 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +52 0 obj +<< /Contents 108 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +53 0 obj +<< /Contents 109 0 R /MediaBox [ 0 0 612 792 ] /Parent 2 0 R /Resources << /Font << /F1 79 0 R >> /ProcSet 80 0 R >> /Type /Page >> +endobj +54 0 obj +<< /Length 48 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,Tr  endstream +endobj +55 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> +endobj +56 0 obj +[ /PDF /Text ] +endobj +57 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼TM,. +endstream +endobj +58 0 obj +<< /BaseFont /Times-Roman /Encoding /WinAnsiEncoding /Subtype /Type1 /Type /Font >> +endobj +59 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼TCM,. ,endstream +endobj +60 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼T#M,. -endstream +endobj +61 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼TcM,. .endstream +endobj +62 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼TM,.) /endstream +endobj +63 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼TSM,.2 0endstream +endobj +64 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼T3M,.; 1endstream +endobj +65 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼TsM,.D 2endstream +endobj +66 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼T M,.M 3endstream +endobj +67 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼TKM,.V 4endstream +endobj +68 0 obj +<< /Filter /FlateDecode /Length 54 >> +stream +xs +Qw3T04UIS07" ̼TCM,." \endstream +endobj +69 0 obj +<< /Filter /FlateDecode /Length 54 >> +stream +xs +Qw3T04UIS07" ̼TCCM,.") ]endstream +endobj +70 0 obj +<< /Filter /FlateDecode /Length 54 >> +stream +xs +Qw3T04UIS07" ̼TC#M,."2 ^endstream +endobj +71 0 obj +<< /Filter /FlateDecode /Length 54 >> +stream +xs +Qw3T04UIS07" ̼TCcM,."; _endstream +endobj +72 0 obj +<< /Filter /FlateDecode /Length 54 >> +stream +xs +Qw3T04UIS07" ̼TCM,."D `endstream +endobj +73 0 obj +<< /Filter /FlateDecode /Length 53 >> +stream +xs +Qw3T04UIS07" ̼TBHk"M aendstream +endobj +74 0 obj +<< /Filter /FlateDecode /Length 54 >> +stream +xs +Qw3T04UIS07" ̼TC3M,."V bendstream +endobj +75 0 obj +<< /Filter /FlateDecode /Length 54 >> +stream +xs +Qw3T04UIS07" ̼TCsM,."_ cendstream +endobj +76 0 obj +<< /Filter /FlateDecode /Length 54 >> +stream +xs +Qw3T04UIS07" ̼TC M,."h dendstream +endobj +77 0 obj +<< /Filter /FlateDecode /Length 54 >> +stream +xs +Qw3T04UIS07" ̼TCKM,."q eendstream +endobj +78 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr  +endstream +endobj +79 0 obj +<< /BaseFont /Helvetica /Encoding /WinAnsiEncoding /Name /F1 /Subtype /Type1 /Type /Font >> +endobj +80 0 obj +[ /PDF /Text ] +endobj +81 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr " +endstream +endobj +82 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr + +endstream +endobj +83 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr 4 +endstream +endobj +84 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr = +endstream +endobj +85 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr F +endstream +endobj +86 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr O +endstream +endobj +87 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr X +endstream +endobj +88 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,WTr a + endstream +endobj +89 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,WTr j +!endstream +endobj +90 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W04Tr 7 +Iendstream +endobj +91 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W04Tr @ +Jendstream +endobj +92 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W04Tr I +Kendstream +endobj +93 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W04Tr R +Lendstream +endobj +94 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W04Tr [ +Mendstream +endobj +95 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W04Tr d +Nendstream +endobj +96 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W04Tr m +Oendstream +endobj +97 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W04Tr v +Pendstream +endobj +98 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr  +Qendstream +endobj +99 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr  +Rendstream +endobj +100 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W02Tr A +Jendstream +endobj +101 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W02Tr J +Kendstream +endobj +102 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W02Tr S +Lendstream +endobj +103 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W02Tr \ +Mendstream +endobj +104 0 obj +<< /Length 50 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,i*dqpe +Nendstream +endobj +105 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W02Tr n +Oendstream +endobj +106 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W02Tr w +Pendstream +endobj +107 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W02Tr  +Qendstream +endobj +108 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr  +Rendstream +endobj +109 0 obj +<< /Length 51 /Filter /FlateDecode >> +stream +xs +RPw3T02QI͍@!$/I,W0Tr  +Sendstream +endobj +xref +0 110 +0000000000 65535 f +0000000015 00000 n +0000000064 00000 n +0000000468 00000 n +0000000614 00000 n +0000000768 00000 n +0000000922 00000 n +0000001076 00000 n +0000001230 00000 n +0000001384 00000 n +0000001538 00000 n +0000001693 00000 n +0000001848 00000 n +0000002003 00000 n +0000002158 00000 n +0000002313 00000 n +0000002468 00000 n +0000002623 00000 n +0000002778 00000 n +0000002933 00000 n +0000003088 00000 n +0000003243 00000 n +0000003398 00000 n +0000003553 00000 n +0000003708 00000 n +0000003855 00000 n +0000004002 00000 n +0000004149 00000 n +0000004296 00000 n +0000004443 00000 n +0000004590 00000 n +0000004737 00000 n +0000004884 00000 n +0000005031 00000 n +0000005178 00000 n +0000005325 00000 n +0000005472 00000 n +0000005619 00000 n +0000005766 00000 n +0000005913 00000 n +0000006060 00000 n +0000006207 00000 n +0000006354 00000 n +0000006501 00000 n +0000006648 00000 n +0000006796 00000 n +0000006944 00000 n +0000007092 00000 n +0000007240 00000 n +0000007388 00000 n +0000007536 00000 n +0000007684 00000 n +0000007832 00000 n +0000007980 00000 n +0000008128 00000 n +0000008247 00000 n +0000008355 00000 n +0000008386 00000 n +0000008510 00000 n +0000008610 00000 n +0000008734 00000 n +0000008858 00000 n +0000008982 00000 n +0000009106 00000 n +0000009230 00000 n +0000009354 00000 n +0000009478 00000 n +0000009602 00000 n +0000009726 00000 n +0000009851 00000 n +0000009976 00000 n +0000010101 00000 n +0000010226 00000 n +0000010351 00000 n +0000010475 00000 n +0000010600 00000 n +0000010725 00000 n +0000010850 00000 n +0000010975 00000 n +0000011096 00000 n +0000011204 00000 n +0000011235 00000 n +0000011356 00000 n +0000011477 00000 n +0000011598 00000 n +0000011719 00000 n +0000011840 00000 n +0000011961 00000 n +0000012082 00000 n +0000012203 00000 n +0000012324 00000 n +0000012446 00000 n +0000012568 00000 n +0000012690 00000 n +0000012812 00000 n +0000012934 00000 n +0000013056 00000 n +0000013178 00000 n +0000013300 00000 n +0000013422 00000 n +0000013544 00000 n +0000013667 00000 n +0000013790 00000 n +0000013913 00000 n +0000014036 00000 n +0000014158 00000 n +0000014281 00000 n +0000014404 00000 n +0000014527 00000 n +0000014650 00000 n +trailer << /Root 1 0 R /Size 110 /ID [<31415926535897932384626433832795><31415926535897932384626433832795>] >> +startxref +14773 +%%EOF