ruport 1.6.3 → 1.8.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (57) hide show
  1. checksums.yaml +7 -0
  2. data/AUTHORS +11 -0
  3. data/CHANGELOG.md +38 -0
  4. data/HACKING +1 -17
  5. data/README.md +97 -0
  6. data/Rakefile +9 -50
  7. data/examples/add_row_table.rb +46 -0
  8. data/examples/data/wine.csv +255 -0
  9. data/examples/pdf_grouping.rb +39 -0
  10. data/examples/pdf_table.rb +28 -0
  11. data/examples/pdf_table_from_csv.rb +26 -0
  12. data/examples/pdf_table_prawn.rb +30 -0
  13. data/examples/pdf_table_simple.rb +13 -0
  14. data/examples/row_renderer.rb +1 -1
  15. data/examples/simple_pdf_lines.rb +1 -1
  16. data/examples/trac_ticket_status.rb +1 -1
  17. data/lib/ruport/controller.rb +17 -21
  18. data/lib/ruport/data/feeder.rb +2 -2
  19. data/lib/ruport/data/grouping.rb +8 -8
  20. data/lib/ruport/data/record.rb +4 -4
  21. data/lib/ruport/data/table.rb +318 -206
  22. data/lib/ruport/formatter/csv.rb +6 -7
  23. data/lib/ruport/formatter/html.rb +13 -11
  24. data/lib/ruport/formatter/markdown.rb +105 -0
  25. data/lib/ruport/formatter/prawn_pdf.rb +159 -0
  26. data/lib/ruport/formatter/template.rb +1 -1
  27. data/lib/ruport/formatter/text.rb +1 -1
  28. data/lib/ruport/formatter.rb +54 -54
  29. data/lib/ruport/version.rb +1 -1
  30. data/lib/ruport.rb +7 -23
  31. data/test/controller_test.rb +201 -225
  32. data/test/csv_formatter_test.rb +36 -36
  33. data/test/data_feeder_test.rb +64 -64
  34. data/test/expected_outputs/prawn_pdf_formatter/pdf_basic.pdf.test +265 -0
  35. data/test/grouping_test.rb +103 -102
  36. data/test/helpers.rb +29 -10
  37. data/test/html_formatter_test.rb +46 -46
  38. data/test/markdown_formatter_test.rb +142 -0
  39. data/test/prawn_pdf_formatter_test.rb +108 -0
  40. data/test/record_test.rb +91 -91
  41. data/test/samples/sales.csv +21 -0
  42. data/test/table_pivot_test.rb +77 -26
  43. data/test/table_test.rb +376 -354
  44. data/test/template_test.rb +13 -13
  45. data/test/text_formatter_test.rb +52 -52
  46. data/util/bench/data/table/bench_column_manip.rb +0 -1
  47. data/util/bench/data/table/bench_dup.rb +0 -1
  48. data/util/bench/data/table/bench_init.rb +1 -2
  49. data/util/bench/data/table/bench_manip.rb +0 -1
  50. data/util/bench/formatter/bench_csv.rb +0 -1
  51. data/util/bench/formatter/bench_html.rb +0 -1
  52. data/util/bench/formatter/bench_pdf.rb +0 -1
  53. data/util/bench/formatter/bench_text.rb +0 -1
  54. metadata +131 -82
  55. data/README +0 -114
  56. data/lib/ruport/formatter/pdf.rb +0 -591
  57. data/test/pdf_formatter_test.rb +0 -354
@@ -1,15 +1,15 @@
1
- #!/usr/bin/env ruby -w
1
+ #!/usr/bin/env ruby -w
2
2
  require File.join(File.expand_path(File.dirname(__FILE__)), "helpers")
3
3
 
4
- class TestRenderCSVRow < Test::Unit::TestCase
4
+ class TestRenderCSVRow < Minitest::Test
5
5
  def test_render_csv_row
6
6
  actual = Ruport::Controller::Row.render_csv(:data => [1,2,3])
7
7
  assert_equal("1,2,3\n", actual)
8
8
  end
9
9
  end
10
10
 
11
- class TestRenderCSVTable < Test::Unit::TestCase
12
-
11
+ class TestRenderCSVTable < Minitest::Test
12
+
13
13
  def setup
14
14
  Ruport::Formatter::Template.create(:simple) do |format|
15
15
  format.table = {
@@ -24,47 +24,47 @@ class TestRenderCSVTable < Test::Unit::TestCase
24
24
  end
25
25
 
26
26
  def test_render_csv_table
27
- actual = Ruport::Controller::Table.render_csv do |r|
28
- r.data = Table([], :data => [[1,2,3],[4,5,6]])
27
+ actual = Ruport::Controller::Table.render_csv do |r|
28
+ r.data = Ruport.Table([], :data => [[1,2,3],[4,5,6]])
29
29
  end
30
30
  assert_equal("1,2,3\n4,5,6\n",actual)
31
31
 
32
32
  actual = Ruport::Controller::Table.render_csv do |r|
33
- r.data = Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
33
+ r.data = Ruport.Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
34
34
  end
35
35
  assert_equal("a,b,c\n1,2,3\n4,5,6\n",actual)
36
- end
37
-
36
+ end
37
+
38
38
  def test_format_options
39
- a = Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
40
- assert_equal "a\tb\tc\n1\t2\t3\n4\t5\t6\n",
39
+ a = Ruport.Table(%w[a b c], :data => [[1,2,3],[4,5,6]])
40
+ assert_equal "a\tb\tc\n1\t2\t3\n4\t5\t6\n",
41
41
  a.as(:csv,:format_options => { :col_sep => "\t" })
42
42
  end
43
43
 
44
44
  def test_table_headers
45
45
  actual = Ruport::Controller::Table.
46
- render_csv(:show_table_headers => false,
47
- :data => Table(%w[a b c], :data => [[1,2,3],[4,5,6]]))
46
+ render_csv(:show_table_headers => false,
47
+ :data => Ruport.Table(%w[a b c], :data => [[1,2,3],[4,5,6]]))
48
48
  assert_equal("1,2,3\n4,5,6\n",actual)
49
49
  end
50
-
50
+
51
51
  def test_render_with_template
52
52
  formatter = Ruport::Formatter::CSV.new
53
53
  formatter.options = Ruport::Controller::Options.new
54
54
  formatter.options.template = :simple
55
55
  formatter.apply_template
56
-
56
+
57
57
  assert_equal false, formatter.options.show_table_headers
58
58
 
59
59
  assert_equal :justified, formatter.options.style
60
60
  assert_equal false, formatter.options.show_group_headers
61
-
61
+
62
62
  assert_equal ":", formatter.options.format_options[:col_sep]
63
63
  end
64
64
 
65
65
  def test_options_hashes_override_template
66
66
  opts = nil
67
- table = Table(%w[a b c])
67
+ table = Ruport.Table(%w[a b c])
68
68
  table.to_csv(
69
69
  :template => :simple,
70
70
  :table_format => {
@@ -77,7 +77,7 @@ class TestRenderCSVTable < Test::Unit::TestCase
77
77
  ) do |r|
78
78
  opts = r.options
79
79
  end
80
-
80
+
81
81
  assert_equal true, opts.show_table_headers
82
82
 
83
83
  assert_equal :raw, opts.style
@@ -86,7 +86,7 @@ class TestRenderCSVTable < Test::Unit::TestCase
86
86
 
87
87
  def test_individual_options_override_template
88
88
  opts = nil
89
- table = Table(%w[a b c])
89
+ table = Ruport.Table(%w[a b c])
90
90
  table.to_csv(
91
91
  :template => :simple,
92
92
  :show_table_headers => true,
@@ -96,17 +96,17 @@ class TestRenderCSVTable < Test::Unit::TestCase
96
96
  ) do |r|
97
97
  opts = r.options
98
98
  end
99
-
99
+
100
100
  assert_equal true, opts.show_table_headers
101
101
 
102
102
  assert_equal :raw, opts.style
103
103
  assert_equal true, opts.show_group_headers
104
-
104
+
105
105
  assert_equal ";", opts.format_options[:col_sep]
106
106
  end
107
- end
107
+ end
108
108
 
109
- class TestRenderCSVGroup < Test::Unit::TestCase
109
+ class TestRenderCSVGroup < Minitest::Test
110
110
 
111
111
  def test_render_csv_group
112
112
  group = Ruport::Data::Group.new(:name => 'test',
@@ -115,13 +115,13 @@ class TestRenderCSVGroup < Test::Unit::TestCase
115
115
  actual = Ruport::Controller::Group.
116
116
  render_csv(:data => group, :show_table_headers => false )
117
117
  assert_equal("test\n\n1,2,3\n4,5,6\n",actual)
118
- end
119
-
118
+ end
119
+
120
120
  end
121
121
 
122
- class RenderCSVGrouping < Test::Unit::TestCase
122
+ class RenderCSVGrouping < Minitest::Test
123
123
  def test_render_csv_grouping
124
- table = Table(%w[hi red snapper]) << %w[is this annoying] <<
124
+ table = Ruport.Table(%w[hi red snapper]) << %w[is this annoying] <<
125
125
  %w[is it funny]
126
126
  grouping = Grouping(table,:by => "hi")
127
127
 
@@ -131,34 +131,34 @@ class RenderCSVGrouping < Test::Unit::TestCase
131
131
  end
132
132
 
133
133
  def test_render_csv_grouping_without_header
134
- table = Table(%w[hi red snapper]) << %w[is this annoying] <<
134
+ table = Ruport.Table(%w[hi red snapper]) << %w[is this annoying] <<
135
135
  %w[is it funny]
136
136
  grouping = Grouping(table,:by => "hi")
137
137
 
138
138
  actual = grouping.to_csv :show_table_headers => false
139
139
 
140
140
  assert_equal "is\n\nthis,annoying\nit,funny\n\n", actual
141
- end
141
+ end
142
142
 
143
143
  def test_alternative_styles
144
- g = Grouping((Table(%w[a b c]) << [1,2,3] << [1,1,4] <<
144
+ g = Grouping((Ruport.Table(%w[a b c]) << [1,2,3] << [1,1,4] <<
145
145
  [2,1,2] << [1,9,1] ), :by => "a")
146
-
147
- assert_raise(NotImplementedError) { g.to_csv :style => :not_real }
148
146
 
149
- assert_equal "a,b,c\n1,2,3\n,1,4\n,9,1\n\n2,1,2\n\n",
147
+ assert_raises(NotImplementedError) { g.to_csv :style => :not_real }
148
+
149
+ assert_equal "a,b,c\n1,2,3\n,1,4\n,9,1\n\n2,1,2\n\n",
150
150
  g.to_csv(:style => :justified)
151
151
 
152
152
  assert_equal "a,b,c\n1,2,3\n1,1,4\n1,9,1\n\n2,1,2\n\n",
153
- g.to_csv(:style => :raw)
153
+ g.to_csv(:style => :raw)
154
154
  end
155
155
 
156
156
  # -----------------------------------------------------------------------
157
157
  # BUG TRAPS
158
158
  # ------------------------------------------------------------------------
159
-
159
+
160
160
  def test_ensure_group_names_are_converted_to_string
161
- g = Grouping((Table(%w[a b c])<<[1,2,3]<<[1,1,4]), :by => "a")
161
+ g = Grouping((Ruport.Table(%w[a b c])<<[1,2,3]<<[1,1,4]), :by => "a")
162
162
  assert_equal "1\n\nb,c\n2,3\n1,4\n\n", g.to_csv
163
163
  end
164
164
  end
@@ -1,88 +1,88 @@
1
- #!/usr/bin/env ruby -w
2
- require File.join(File.expand_path(File.dirname(__FILE__)), "helpers")
1
+ #!/usr/bin/env ruby -w
2
+ require File.join(File.expand_path(File.dirname(__FILE__)), "helpers")
3
+
4
+ class DataFeederTest < Minitest::Test
3
5
 
4
- class DataFeederTest < Test::Unit::TestCase
5
-
6
6
  context "when using a default data feeder" do
7
-
8
- def setup
9
- @feeder = Ruport::Data::Feeder.new(Table(%w[a b c]))
10
- end
11
-
12
- def specify_data_attribute_should_return_wrapped_data
13
- assert_equal Table(%w[a b c]), @feeder.data
7
+
8
+ setup do
9
+ @feeder = Ruport::Data::Feeder.new(Ruport.Table(%w[a b c]))
10
+ end
11
+
12
+ should "data attribute should return wrapped data" do
13
+ assert_equal Ruport.Table(%w[a b c]), @feeder.data
14
14
  end
15
-
16
- def specify_append_should_forward_to_wrapped_data_by_default
17
- t = Table(%w[a b c])
15
+
16
+ should "append should forward to wrapped data by default" do
17
+ t = Ruport.Table(%w[a b c])
18
18
  t << [1,2,3] << {"a" => 2, "b" => 3, "c" => 4}
19
- @feeder << [1,2,3] << {"a" => 2, "b" => 3, "c" => 4}
20
- assert_equal t, @feeder.data
21
- end
22
-
23
- end
24
-
19
+ @feeder << [1,2,3] << {"a" => 2, "b" => 3, "c" => 4}
20
+ assert_equal t, @feeder.data
21
+ end
22
+
23
+ end
24
+
25
25
  context "when using a feeder with a filter" do
26
- def setup
27
- @feeder = Ruport::Data::Feeder.new(Table(%w[a b c]))
26
+ setup do
27
+ @feeder = Ruport::Data::Feeder.new(Ruport.Table(%w[a b c]))
28
28
  @feeder.filter { |r| r.a != 1 }
29
- end
30
-
31
- def specify_filter_should_only_append_rows_for_which_block_is_true
29
+ end
30
+
31
+ should "filter should only append rows for which block is true" do
32
32
  @feeder << [1,2,3] << [4,1,2] << [3,1,1] << [1,2,5]
33
- assert_equal Table(%w[a b c], :data => [[4,1,2],[3,1,1]]), @feeder.data
33
+ assert_equal Ruport.Table(%w[a b c], :data => [[4,1,2],[3,1,1]]), @feeder.data
34
34
  end
35
- end
36
-
35
+ end
36
+
37
37
  context "when using a feeder with a transform" do
38
- def setup
39
- @feeder = Ruport::Data::Feeder.new(Table(%w[a b c]))
38
+ setup do
39
+ @feeder = Ruport::Data::Feeder.new(Ruport.Table(%w[a b c]))
40
40
  @feeder.transform { |r| r.a += 1 }
41
41
  end
42
-
43
- def specify_filter_should_be_applied_to_all_rows
42
+
43
+ should "filter should be applied to all rows" do
44
44
  @feeder << [1,2,3] << [4,1,2] << [3,1,1] << [1,2,5]
45
- assert_equal Table(%w[a b c], :data => [[2,2,3],[5,1,2],[4,1,1],[2,2,5]]),
45
+ assert_equal Ruport.Table(%w[a b c], :data => [[2,2,3],[5,1,2],[4,1,1],[2,2,5]]),
46
46
  @feeder.data
47
- end
48
- end
49
-
47
+ end
48
+ end
49
+
50
50
  context "when using a feeder and a filter together" do
51
- def setup
52
- @feeder = Ruport::Data::Feeder.new(Table(%w[a b c]))
53
- end
54
-
55
- def specify_filter_is_called_first_when_defined_first
51
+ setup do
52
+ @feeder = Ruport::Data::Feeder.new(Ruport.Table(%w[a b c]))
53
+ end
54
+
55
+ should "filter is called first when defined first" do
56
56
  @feeder.filter { |r| r.b != 2 }
57
57
  @feeder.transform { |r| r.b += 1 }
58
- @feeder << [1,2,3] << [4,1,2] << [3,1,1] << [1,2,5]
59
- assert_equal Table(%w[a b c], :data => [[4,2,2],[3,2,1]]),
58
+ @feeder << [1,2,3] << [4,1,2] << [3,1,1] << [1,2,5]
59
+ assert_equal Ruport.Table(%w[a b c], :data => [[4,2,2],[3,2,1]]),
60
60
  @feeder.data
61
61
  end
62
-
63
- def specify_transform_is_called_first_when_defined_first
64
- @feeder.transform { |r| r.b += 1 }
65
- @feeder.filter { |r| r.b != 2 }
66
- @feeder << [1,2,3] << [4,1,2] << [3,1,1] << [1,2,5]
67
- assert_equal Table(%w[a b c], :data => [[1,3,3],[1,3,5]]),
62
+
63
+ should "transform is called first when defined first" do
64
+ @feeder.transform { |r| r.b += 1 }
65
+ @feeder.filter { |r| r.b != 2 }
66
+ @feeder << [1,2,3] << [4,1,2] << [3,1,1] << [1,2,5]
67
+ assert_equal Ruport.Table(%w[a b c], :data => [[1,3,3],[1,3,5]]),
68
68
  @feeder.data
69
- end
70
- end
71
-
69
+ end
70
+ end
71
+
72
72
  context "when using many feeders and filters together" do
73
- def setup
74
- @feeder = Ruport::Data::Feeder.new(Table(%w[a b c]))
75
- @feeder.transform { |r| r.a += 1 }
73
+ setup do
74
+ @feeder = Ruport::Data::Feeder.new(Ruport.Table(%w[a b c]))
75
+ @feeder.transform { |r| r.a += 1 }
76
76
  @feeder.filter { |r| r.a > 5 }
77
- @feeder.transform { |r| r.b = r.b.to_s }
78
- @feeder.filter { |r| r.b == "3" }
77
+ @feeder.transform { |r| r.b = r.b.to_s }
78
+ @feeder.filter { |r| r.b == "3" }
79
79
  end
80
-
81
- def specify_all_blocks_are_executed_in_order
82
- @feeder << [1,2,3] << [4,1,9] << [5,3,1] << [2,3,0] << [7,3,5]
83
- assert_equal Table(%w[a b c], :data => [[6,"3",1],[8,"3",5]]),
80
+
81
+ should "all blocks are executed in order" do
82
+ @feeder << [1,2,3] << [4,1,9] << [5,3,1] << [2,3,0] << [7,3,5]
83
+ assert_equal Ruport.Table(%w[a b c], :data => [[6,"3",1],[8,"3",5]]),
84
84
  @feeder.data
85
- end
85
+ end
86
86
  end
87
-
88
- end
87
+
88
+ end
@@ -0,0 +1,265 @@
1
+ %PDF-1.3
2
+ %����
3
+ 1 0 obj
4
+ << /Creator <feff0050007200610077006e>
5
+ /Producer <feff0050007200610077006e>
6
+ >>
7
+ endobj
8
+ 2 0 obj
9
+ << /Type /Catalog
10
+ /Pages 3 0 R
11
+ >>
12
+ endobj
13
+ 3 0 obj
14
+ << /Type /Pages
15
+ /Count 1
16
+ /Kids [5 0 R]
17
+ >>
18
+ endobj
19
+ 4 0 obj
20
+ << /Length 1894
21
+ >>
22
+ stream
23
+ q
24
+ 1 w
25
+ /DeviceRGB CS
26
+ 0.0 0.0 0.0 SCN
27
+ 36.0 756.0 m
28
+ 52.672 756.0 l
29
+ S
30
+ [] 0 d
31
+ 1 w
32
+ 0.0 0.0 0.0 SCN
33
+ 36.0 732.128 m
34
+ 52.672 732.128 l
35
+ S
36
+ [] 0 d
37
+ 1 w
38
+ 0.0 0.0 0.0 SCN
39
+ 36.0 756.5 m
40
+ 36.0 731.628 l
41
+ S
42
+ [] 0 d
43
+ 1 w
44
+ 0.0 0.0 0.0 SCN
45
+ 52.672 756.5 m
46
+ 52.672 731.628 l
47
+ S
48
+ [] 0 d
49
+ 1 w
50
+ 0.0 0.0 0.0 SCN
51
+
52
+ BT
53
+ 41.0 739.756 Td
54
+ /F1.0 12 Tf
55
+ [<61>] TJ
56
+ ET
57
+
58
+ 1 w
59
+ 0.0 0.0 0.0 SCN
60
+ 52.672 756.0 m
61
+ 69.344 756.0 l
62
+ S
63
+ [] 0 d
64
+ 1 w
65
+ 0.0 0.0 0.0 SCN
66
+ 52.672 732.128 m
67
+ 69.344 732.128 l
68
+ S
69
+ [] 0 d
70
+ 1 w
71
+ 0.0 0.0 0.0 SCN
72
+ 52.672 756.5 m
73
+ 52.672 731.628 l
74
+ S
75
+ [] 0 d
76
+ 1 w
77
+ 0.0 0.0 0.0 SCN
78
+ 69.344 756.5 m
79
+ 69.344 731.628 l
80
+ S
81
+ [] 0 d
82
+ 1 w
83
+ 0.0 0.0 0.0 SCN
84
+
85
+ BT
86
+ 57.672 739.756 Td
87
+ /F1.0 12 Tf
88
+ [<62>] TJ
89
+ ET
90
+
91
+ 1 w
92
+ 0.0 0.0 0.0 SCN
93
+ 69.344 756.0 m
94
+ 86.016 756.0 l
95
+ S
96
+ [] 0 d
97
+ 1 w
98
+ 0.0 0.0 0.0 SCN
99
+ 69.344 732.128 m
100
+ 86.016 732.128 l
101
+ S
102
+ [] 0 d
103
+ 1 w
104
+ 0.0 0.0 0.0 SCN
105
+ 69.344 756.5 m
106
+ 69.344 731.628 l
107
+ S
108
+ [] 0 d
109
+ 1 w
110
+ 0.0 0.0 0.0 SCN
111
+ 86.016 756.5 m
112
+ 86.016 731.628 l
113
+ S
114
+ [] 0 d
115
+ 1 w
116
+ 0.0 0.0 0.0 SCN
117
+
118
+ BT
119
+ 74.344 739.756 Td
120
+ /F1.0 12 Tf
121
+ [<63>] TJ
122
+ ET
123
+
124
+ 1 w
125
+ 0.0 0.0 0.0 SCN
126
+ 36.0 732.128 m
127
+ 52.672 732.128 l
128
+ S
129
+ [] 0 d
130
+ 1 w
131
+ 0.0 0.0 0.0 SCN
132
+ 36.0 708.256 m
133
+ 52.672 708.256 l
134
+ S
135
+ [] 0 d
136
+ 1 w
137
+ 0.0 0.0 0.0 SCN
138
+ 36.0 732.628 m
139
+ 36.0 707.756 l
140
+ S
141
+ [] 0 d
142
+ 1 w
143
+ 0.0 0.0 0.0 SCN
144
+ 52.672 732.628 m
145
+ 52.672 707.756 l
146
+ S
147
+ [] 0 d
148
+ 1 w
149
+ 0.0 0.0 0.0 SCN
150
+
151
+ BT
152
+ 41.0 715.884 Td
153
+ /F1.0 12 Tf
154
+ [<31>] TJ
155
+ ET
156
+
157
+ 1 w
158
+ 0.0 0.0 0.0 SCN
159
+ 52.672 732.128 m
160
+ 69.344 732.128 l
161
+ S
162
+ [] 0 d
163
+ 1 w
164
+ 0.0 0.0 0.0 SCN
165
+ 52.672 708.256 m
166
+ 69.344 708.256 l
167
+ S
168
+ [] 0 d
169
+ 1 w
170
+ 0.0 0.0 0.0 SCN
171
+ 52.672 732.628 m
172
+ 52.672 707.756 l
173
+ S
174
+ [] 0 d
175
+ 1 w
176
+ 0.0 0.0 0.0 SCN
177
+ 69.344 732.628 m
178
+ 69.344 707.756 l
179
+ S
180
+ [] 0 d
181
+ 1 w
182
+ 0.0 0.0 0.0 SCN
183
+
184
+ BT
185
+ 57.672 715.884 Td
186
+ /F1.0 12 Tf
187
+ [<32>] TJ
188
+ ET
189
+
190
+ 1 w
191
+ 0.0 0.0 0.0 SCN
192
+ 69.344 732.128 m
193
+ 86.016 732.128 l
194
+ S
195
+ [] 0 d
196
+ 1 w
197
+ 0.0 0.0 0.0 SCN
198
+ 69.344 708.256 m
199
+ 86.016 708.256 l
200
+ S
201
+ [] 0 d
202
+ 1 w
203
+ 0.0 0.0 0.0 SCN
204
+ 69.344 732.628 m
205
+ 69.344 707.756 l
206
+ S
207
+ [] 0 d
208
+ 1 w
209
+ 0.0 0.0 0.0 SCN
210
+ 86.016 732.628 m
211
+ 86.016 707.756 l
212
+ S
213
+ [] 0 d
214
+ 1 w
215
+ 0.0 0.0 0.0 SCN
216
+
217
+ BT
218
+ 74.344 715.884 Td
219
+ /F1.0 12 Tf
220
+ [<33>] TJ
221
+ ET
222
+
223
+ Q
224
+
225
+ endstream
226
+ endobj
227
+ 5 0 obj
228
+ << /Type /Page
229
+ /Parent 3 0 R
230
+ /MediaBox [0 0 612 792]
231
+ /CropBox [0 0 612 792]
232
+ /BleedBox [0 0 612 792]
233
+ /TrimBox [0 0 612 792]
234
+ /ArtBox [0 0 612 792]
235
+ /Contents 4 0 R
236
+ /Resources << /ProcSet [/PDF /Text /ImageB /ImageC /ImageI]
237
+ /Font << /F1.0 6 0 R
238
+ >>
239
+ >>
240
+ >>
241
+ endobj
242
+ 6 0 obj
243
+ << /Type /Font
244
+ /Subtype /Type1
245
+ /BaseFont /Helvetica
246
+ /Encoding /WinAnsiEncoding
247
+ >>
248
+ endobj
249
+ xref
250
+ 0 7
251
+ 0000000000 65535 f
252
+ 0000000015 00000 n
253
+ 0000000109 00000 n
254
+ 0000000158 00000 n
255
+ 0000000215 00000 n
256
+ 0000002161 00000 n
257
+ 0000002427 00000 n
258
+ trailer
259
+ << /Size 7
260
+ /Root 2 0 R
261
+ /Info 1 0 R
262
+ >>
263
+ startxref
264
+ 2524
265
+ %%EOF