fireinc-pdf-reader 0.11.0.alpha

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (54) hide show
  1. data/CHANGELOG +168 -0
  2. data/MIT-LICENSE +21 -0
  3. data/README.rdoc +137 -0
  4. data/Rakefile +34 -0
  5. data/TODO +45 -0
  6. data/bin/pdf_list_callbacks +15 -0
  7. data/bin/pdf_object +48 -0
  8. data/bin/pdf_text +15 -0
  9. data/examples/callbacks.rb +21 -0
  10. data/examples/extract_bates.rb +49 -0
  11. data/examples/extract_images.rb +108 -0
  12. data/examples/hash.rb +12 -0
  13. data/examples/metadata.rb +25 -0
  14. data/examples/page_counter_improved.rb +23 -0
  15. data/examples/page_counter_naive.rb +24 -0
  16. data/examples/rspec.rb +57 -0
  17. data/examples/text.rb +40 -0
  18. data/examples/version.rb +25 -0
  19. data/lib/pdf/hash.rb +15 -0
  20. data/lib/pdf/reader/abstract_strategy.rb +81 -0
  21. data/lib/pdf/reader/buffer.rb +346 -0
  22. data/lib/pdf/reader/cmap.rb +138 -0
  23. data/lib/pdf/reader/encoding.rb +190 -0
  24. data/lib/pdf/reader/encodings/mac_expert.txt +159 -0
  25. data/lib/pdf/reader/encodings/mac_roman.txt +128 -0
  26. data/lib/pdf/reader/encodings/pdf_doc.txt +40 -0
  27. data/lib/pdf/reader/encodings/standard.txt +47 -0
  28. data/lib/pdf/reader/encodings/symbol.txt +154 -0
  29. data/lib/pdf/reader/encodings/win_ansi.txt +29 -0
  30. data/lib/pdf/reader/encodings/zapf_dingbats.txt +201 -0
  31. data/lib/pdf/reader/error.rb +53 -0
  32. data/lib/pdf/reader/filter.rb +219 -0
  33. data/lib/pdf/reader/font.rb +133 -0
  34. data/lib/pdf/reader/form_xobject.rb +83 -0
  35. data/lib/pdf/reader/glyphlist.txt +4322 -0
  36. data/lib/pdf/reader/lzw.rb +123 -0
  37. data/lib/pdf/reader/metadata_strategy.rb +56 -0
  38. data/lib/pdf/reader/object_cache.rb +85 -0
  39. data/lib/pdf/reader/object_hash.rb +289 -0
  40. data/lib/pdf/reader/object_stream.rb +51 -0
  41. data/lib/pdf/reader/page.rb +185 -0
  42. data/lib/pdf/reader/page_text_receiver.rb +278 -0
  43. data/lib/pdf/reader/pages_strategy.rb +475 -0
  44. data/lib/pdf/reader/parser.rb +225 -0
  45. data/lib/pdf/reader/print_receiver.rb +18 -0
  46. data/lib/pdf/reader/reference.rb +66 -0
  47. data/lib/pdf/reader/register_receiver.rb +95 -0
  48. data/lib/pdf/reader/stream.rb +69 -0
  49. data/lib/pdf/reader/text_receiver.rb +264 -0
  50. data/lib/pdf/reader/token.rb +41 -0
  51. data/lib/pdf/reader/xref.rb +220 -0
  52. data/lib/pdf/reader.rb +296 -0
  53. data/lib/pdf-reader.rb +1 -0
  54. metadata +211 -0
@@ -0,0 +1,138 @@
1
+ ################################################################################
2
+ #
3
+ # Copyright (C) 2008 James Healy (jimmy@deefa.com)
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ #
24
+ ################################################################################
25
+
26
+ class PDF::Reader
27
+ class CMap # :nodoc:
28
+
29
+ def initialize(data)
30
+ @map = {}
31
+ process_data(data)
32
+ end
33
+
34
+ def process_data(data)
35
+ mode = nil
36
+ instructions = ""
37
+
38
+ data.each_line do |l|
39
+ if l.include?("beginbfchar")
40
+ mode = :char
41
+ elsif l.include?("endbfchar")
42
+ process_bfchar_instructions(instructions)
43
+ instructions = ""
44
+ mode = nil
45
+ elsif l.include?("beginbfrange")
46
+ mode = :range
47
+ elsif l.include?("endbfrange")
48
+ process_bfrange_instructions(instructions)
49
+ instructions = ""
50
+ mode = nil
51
+ elsif mode == :char || mode == :range
52
+ instructions << l
53
+ end
54
+ end
55
+ end
56
+
57
+ def size
58
+ @map.size
59
+ end
60
+
61
+ def decode(c)
62
+ # TODO: implement the conversion
63
+ return c unless c.class == Fixnum
64
+ @map[c]
65
+ end
66
+
67
+ private
68
+
69
+ def build_parser(instructions)
70
+ buffer = Buffer.new(StringIO.new(instructions))
71
+ Parser.new(buffer)
72
+ end
73
+
74
+ def str_to_int(str)
75
+ return nil if str.nil? || str.size == 0 || str.size >= 3
76
+
77
+ if str.size == 1
78
+ str.unpack("C*")[0]
79
+ else
80
+ str.unpack("n*")[0]
81
+ end
82
+ end
83
+
84
+ def process_bfchar_instructions(instructions)
85
+ parser = build_parser(instructions)
86
+ find = str_to_int(parser.parse_token)
87
+ replace = str_to_int(parser.parse_token)
88
+ while find && replace
89
+ @map[find] = replace
90
+ find = str_to_int(parser.parse_token)
91
+ replace = str_to_int(parser.parse_token)
92
+ end
93
+ end
94
+
95
+ def process_bfrange_instructions(instructions)
96
+ parser = build_parser(instructions)
97
+ start = parser.parse_token
98
+ finish = parser.parse_token
99
+ to = parser.parse_token
100
+ while start && finish && to
101
+ if start.kind_of?(String) && finish.kind_of?(String) && to.kind_of?(String)
102
+ bfrange_type_one(start, finish, to)
103
+ elsif start.kind_of?(String) && finish.kind_of?(String) && to.kind_of?(Array)
104
+ bfrange_type_two(start, finish, to)
105
+ else
106
+ raise "invalid bfrange section"
107
+ end
108
+ start = parser.parse_token
109
+ finish = parser.parse_token
110
+ to = parser.parse_token
111
+ end
112
+ end
113
+
114
+ def bfrange_type_one(start_code, end_code, dst)
115
+ start_code = str_to_int(start_code)
116
+ end_code = str_to_int(end_code)
117
+ dst = str_to_int(dst)
118
+
119
+ # add all values in the range to our mapping
120
+ (start_code..end_code).each_with_index do |val, idx|
121
+ @map[val] = dst + idx
122
+ # ensure a single range does not exceed 255 chars
123
+ raise PDF::Reader::MalformedPDFError, "a CMap bfrange cann't exceed 255 chars" if idx > 255
124
+ end
125
+ end
126
+
127
+ def bfrange_type_two(start_code, end_code, dst)
128
+ start_code = str_to_int(start_code)
129
+ end_code = str_to_int(end_code)
130
+ from_range = (start_code..end_code)
131
+
132
+ # add all values in the range to our mapping
133
+ from_range.each_with_index do |val, idx|
134
+ @map[val] = str_to_int(dst[idx])
135
+ end
136
+ end
137
+ end
138
+ end
@@ -0,0 +1,190 @@
1
+ ################################################################################
2
+ #
3
+ # Copyright (C) 2008 James Healy (jimmy@deefa.com)
4
+ #
5
+ # Permission is hereby granted, free of charge, to any person obtaining
6
+ # a copy of this software and associated documentation files (the
7
+ # "Software"), to deal in the Software without restriction, including
8
+ # without limitation the rights to use, copy, modify, merge, publish,
9
+ # distribute, sublicense, and/or sell copies of the Software, and to
10
+ # permit persons to whom the Software is furnished to do so, subject to
11
+ # the following conditions:
12
+ #
13
+ # The above copyright notice and this permission notice shall be
14
+ # included in all copies or substantial portions of the Software.
15
+ #
16
+ # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ # EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ # NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ # LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ # OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ # WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23
+ #
24
+ ################################################################################
25
+
26
+ class PDF::Reader
27
+ class Encoding # :nodoc:
28
+ CONTROL_CHARS = [0,1,2,3,4,5,6,7,8,11,12,14,15,16,17,18,19,20,21,22,23,
29
+ 24,25,26,27,28,29,30,31]
30
+ UNKNOWN_CHAR = 0x25AF # ▯
31
+
32
+ attr_reader :unpack
33
+
34
+ def initialize(enc)
35
+ if enc.kind_of?(Hash)
36
+ self.differences = enc[:Differences] if enc[:Differences]
37
+ enc = enc[:Encoding] || enc[:BaseEncoding]
38
+ elsif enc != nil
39
+ enc = enc.to_sym
40
+ else
41
+ enc = nil
42
+ end
43
+
44
+ @to_unicode_required = unicode_required?(enc)
45
+ @unpack = get_unpack(enc)
46
+ @map_file = get_mapping_file(enc)
47
+ load_mapping(@map_file) if @map_file
48
+ end
49
+
50
+ def to_unicode_required?
51
+ @to_unicode_required
52
+ end
53
+
54
+ # set the differences table for this encoding. should be an array in the following format:
55
+ #
56
+ # [25, :A, 26, :B]
57
+ #
58
+ # The array alternates between a decimal byte number and a glyph name to map to that byte
59
+ #
60
+ # To save space the following array is also valid and equivalent to the previous one
61
+ #
62
+ # [25, :A, :B]
63
+ def differences=(diff)
64
+ raise ArgumentError, "diff must be an array" unless diff.kind_of?(Array)
65
+
66
+ @differences = {}
67
+ byte = 0
68
+ diff.each do |val|
69
+ if val.kind_of?(Numeric)
70
+ byte = val.to_i
71
+ else
72
+ @differences[byte] = val
73
+ byte += 1
74
+ end
75
+ end
76
+ @differences
77
+ end
78
+
79
+ def differences
80
+ @differences ||= {}
81
+ end
82
+
83
+ # convert the specified string to utf8
84
+ #
85
+ # * unpack raw bytes into codepoints
86
+ # * replace any that have entries in the differences table with a glyph name
87
+ # * convert codepoints from source encoding to Unicode codepoints
88
+ # * convert any glyph names to Unicode codepoints
89
+ # * replace characters that didn't convert to Unicode nicely with something
90
+ # valid
91
+ # * pack the final array of Unicode codepoints into a utf-8 string
92
+ # * mark the string as utf-8 if we're running on a M17N aware VM
93
+ #
94
+ def to_utf8(str, tounicode = nil)
95
+ ret = str.unpack(unpack).map { |c|
96
+ differences[c] || c
97
+ }.map { |num|
98
+ original_codepoint_to_unicode(num, tounicode)
99
+ }.map { |c|
100
+ glyphnames[c] || c
101
+ }.map { |c|
102
+ if c.nil? || !c.is_a?(Fixnum)
103
+ PDF::Reader::Encoding::UNKNOWN_CHAR
104
+ else
105
+ c
106
+ end
107
+ }.pack("U*")
108
+
109
+ ret.force_encoding("UTF-8") if ret.respond_to?(:force_encoding)
110
+
111
+ ret
112
+ end
113
+
114
+ private
115
+
116
+ def original_codepoint_to_unicode(cp, tounicode = nil)
117
+ if tounicode && (code = tounicode.decode(cp))
118
+ code
119
+ elsif to_unicode_required? && (tounicode.nil? || tounicode.decode(cp).nil?)
120
+ PDF::Reader::Encoding::UNKNOWN_CHAR
121
+ elsif mapping[cp]
122
+ mapping[cp]
123
+ elsif PDF::Reader::Encoding::CONTROL_CHARS.include?(cp)
124
+ PDF::Reader::Encoding::UNKNOWN_CHAR
125
+ else
126
+ cp
127
+ end
128
+ end
129
+
130
+ def get_unpack(enc)
131
+ case enc
132
+ when :"Identity-H", :"Identity-V", :UTF16Encoding
133
+ "n*"
134
+ else
135
+ "C*"
136
+ end
137
+ end
138
+
139
+ def get_mapping_file(enc)
140
+ return File.dirname(__FILE__) + "/encodings/standard.txt" if enc.nil?
141
+ files = {
142
+ :"Identity-H" => nil,
143
+ :"Identity-V" => nil,
144
+ :MacRomanEncoding => File.dirname(__FILE__) + "/encodings/mac_roman.txt",
145
+ :MacExpertEncoding => File.dirname(__FILE__) + "/encodings/mac_expert.txt",
146
+ :PDFDocEncoding => File.dirname(__FILE__) + "/encodings/pdf_doc.txt",
147
+ :StandardEncoding => File.dirname(__FILE__) + "/encodings/standard.txt",
148
+ :SymbolEncoding => File.dirname(__FILE__) + "/encodings/symbol.txt",
149
+ :UTF16Encoding => nil,
150
+ :WinAnsiEncoding => File.dirname(__FILE__) + "/encodings/win_ansi.txt",
151
+ :ZapfDingbatsEncoding => File.dirname(__FILE__) + "/encodings/zapf_dingbats.txt"
152
+ }
153
+
154
+ if files.has_key?(enc)
155
+ files[enc]
156
+ else
157
+ raise UnsupportedFeatureError, "#{enc} is not currently a supported encoding"
158
+ end
159
+ end
160
+
161
+ def unicode_required?(enc)
162
+ enc == :"Identity-H" or enc == :"Identity-V"
163
+ end
164
+
165
+ def mapping
166
+ @mapping ||= {}
167
+ end
168
+
169
+ def has_mapping?
170
+ mapping.size > 0
171
+ end
172
+
173
+ def glyphnames
174
+ @glyphnames ||= PDF::Reader::Font.glyphnames
175
+ end
176
+
177
+ def load_mapping(file)
178
+ return if has_mapping?
179
+
180
+ RUBY_VERSION >= "1.9" ? mode = "r:BINARY" : mode = "r"
181
+ File.open(file, mode) do |f|
182
+ f.each do |l|
183
+ m, single_byte, unicode = *l.match(/([0-9A-Za-z]+);([0-9A-F]{4})/)
184
+ mapping["0x#{single_byte}".hex] = "0x#{unicode}".hex if single_byte
185
+ end
186
+ end
187
+ end
188
+
189
+ end
190
+ end
@@ -0,0 +1,159 @@
1
+ 21;F721
2
+ 22;F6F8 # Hungarumlautsmall
3
+ 23;F7A2
4
+ 24;F724
5
+ 25;F6E4
6
+ 26;F726
7
+ 27;F7B4
8
+ 28;207D
9
+ 29;F07E
10
+ 2A;2025
11
+ 2B;2024
12
+ 2F;2044
13
+ 30;F730
14
+ 31;F731
15
+ 32;F732
16
+ 33;F733
17
+ 34;F734
18
+ 35;F735
19
+ 36;F736
20
+ 37;F737
21
+ 38;F738
22
+ 39;F739
23
+ 3D;F6DE
24
+ 3F;F73F
25
+ 44;F7F0
26
+ 47;00BC
27
+ 48;00BD
28
+ 49;00BE
29
+ 4A;215B
30
+ 4B;215C
31
+ 4C;215D
32
+ 4D;215E
33
+ 4E;2153
34
+ 4F;2154
35
+ 56;FB00
36
+ 57;FB01
37
+ 58;FB02
38
+ 59;FB03
39
+ 5A;FB04
40
+ 5B;208D
41
+ 5D;208E
42
+ 5E;F6F6
43
+ 5F;F6E5
44
+ 60;F760
45
+ 61;F761
46
+ 62;F762
47
+ 63;F763
48
+ 64;F764
49
+ 65;F765
50
+ 66;F766
51
+ 67;F767
52
+ 68;F768
53
+ 69;F769
54
+ 6A;F76A
55
+ 6B;F76B
56
+ 6C;F76C
57
+ 6D;F76D
58
+ 6E;F76E
59
+ 6F;F76F
60
+ 70;F770
61
+ 71;F771
62
+ 72;F772
63
+ 73;F773
64
+ 74;F774
65
+ 75;F775
66
+ 76;F776
67
+ 77;F777
68
+ 78;F778
69
+ 79;F779
70
+ 7A;F77A
71
+ 7B;20A1
72
+ 7C;F6DC
73
+ 7D;F6DD
74
+ 7E;F6FE
75
+ 81;F6E9
76
+ 82;F6E0
77
+ 87;F7E1 # Acircumflexsmall
78
+ 88;F7E0
79
+ 89;F7E2 # Acutesmall
80
+ 8A;F7E4
81
+ 8B;F7E3
82
+ 8C;F7E5
83
+ 8D;F7E7
84
+ 8E;F7E9
85
+ 8F;F7E8
86
+ 90;F7E4
87
+ 91;F7EB
88
+ 92;F7ED
89
+ 93;F7EC
90
+ 94;F7EE
91
+ 95;F7EF
92
+ 96;F7F1
93
+ 97;F7F3
94
+ 98;F7F2
95
+ 99;F7F4
96
+ 9A;F7F6
97
+ 9B;F7F5
98
+ 9C;F7FA
99
+ 9D;F7F9
100
+ 9E;F7FB
101
+ 9F;F7FC
102
+ A1;2078
103
+ A2;2084
104
+ A3;2083
105
+ A4;2086
106
+ A5;2088
107
+ A6;2087
108
+ A7;F6FD
109
+ A9;F6DF
110
+ AA;2082
111
+ AC;F7A8
112
+ AE;F6F5
113
+ AF;F6F0
114
+ B0;2085
115
+ B2;F6E1
116
+ B3;F6E7
117
+ B4;F7FD
118
+ B6;F6E3
119
+ B9;F7FE
120
+ BB;2089
121
+ BC;2080
122
+ BD;F6FF
123
+ BE;F7E6 # AEsmall
124
+ BF;F7F8
125
+ C0;F7BF
126
+ C1;2081
127
+ C2;F6F9
128
+ C9;F7B8
129
+ CF;F6FA
130
+ D0;2012
131
+ D1;F6E6
132
+ D6;F7A1
133
+ D8;F7FF
134
+ DA;00B9
135
+ DB;00B2
136
+ DC;00B3
137
+ DD;2074
138
+ DE;2075
139
+ DF;2076
140
+ E0;2077
141
+ E1;2079
142
+ E2;2070
143
+ E4;F6EC
144
+ E5;F6F1
145
+ E6;F6F3
146
+ E9;F6ED
147
+ EA;F6F2
148
+ EB;F6EB
149
+ F1;F6EE
150
+ F2;F6FB
151
+ F3;F6F4
152
+ F4;F7AF
153
+ F5;F6EF
154
+ F6;207F
155
+ F7;F6EF
156
+ F8;F6E2
157
+ F9;F6E8
158
+ FA;F6F7
159
+ FB;F6FC
@@ -0,0 +1,128 @@
1
+ 80;00C4
2
+ 81;00C5
3
+ 82;00C7
4
+ 83;00C9
5
+ 84;00D1
6
+ 85;00D6
7
+ 86;00DC
8
+ 87;00E1
9
+ 88;00E0
10
+ 89;00E2
11
+ 8A;00E4
12
+ 8B;00E3
13
+ 8C;00E5
14
+ 8D;00E7
15
+ 8E;00E9
16
+ 8F;00E8
17
+ 90;00EA
18
+ 91;00EB
19
+ 92;00ED
20
+ 93;00EC
21
+ 94;00EE
22
+ 95;00EF
23
+ 96;00F1
24
+ 97;00F3
25
+ 98;00F2
26
+ 99;00F4
27
+ 9A;00F6
28
+ 9B;00F5
29
+ 9C;00FA
30
+ 9D;00F9
31
+ 9E;00FB
32
+ 9F;00FC
33
+ A0;2020
34
+ A1;00B0
35
+ A2;00A2
36
+ A3;00A3
37
+ A4;00A7
38
+ A5;2022
39
+ A6;00B6
40
+ A7;00DF
41
+ A8;00AE
42
+ A9;00A9
43
+ AA;2122
44
+ AB;00B4
45
+ AC;00A8
46
+ AD;2260
47
+ AE;00C6
48
+ AF;00D8
49
+ B0;221E
50
+ B1;00B1
51
+ B2;2264
52
+ B3;2265
53
+ B4;00A5
54
+ B5;00B5
55
+ B6;2202
56
+ B7;2211
57
+ B8;220F
58
+ B9;03C0
59
+ BA;222B
60
+ BB;00AA
61
+ BC;00BA
62
+ BD;03A9
63
+ BE;00E6
64
+ BF;00F8
65
+ C0;00BF
66
+ C1;00A1
67
+ C2;00AC
68
+ C3;221A
69
+ C4;0192
70
+ C5;2248
71
+ C6;2206
72
+ C7;00AB
73
+ C8;00BB
74
+ C9;2026
75
+ CA;00A0
76
+ CB;00C0
77
+ CC;00C3
78
+ CD;00D5
79
+ CE;0152
80
+ CF;0153
81
+ D0;2013
82
+ D1;2014
83
+ D2;201C
84
+ D3;201D
85
+ D4;2018
86
+ D5;2019
87
+ D6;00F7
88
+ D7;25CA
89
+ D8;00FF
90
+ D9;0178
91
+ DA;2044
92
+ DB;20AC
93
+ DC;2039
94
+ DD;203A
95
+ DE;FB01
96
+ DF;FB02
97
+ E0;2021
98
+ E1;00B7
99
+ E2;201A
100
+ E3;201E
101
+ E4;2030
102
+ E5;00C2
103
+ E6;00CA
104
+ E7;00C1
105
+ E8;00CB
106
+ E9;00C8
107
+ EA;00CD
108
+ EB;00CE
109
+ EC;00CF
110
+ ED;00CC
111
+ EE;00D3
112
+ EF;00D4
113
+ F0;F8FF
114
+ F1;00D2
115
+ F2;00DA
116
+ F3;00D8
117
+ F4;00D9
118
+ F5;0131
119
+ F6;02C6
120
+ F7;02DC
121
+ F8;00AF
122
+ F9;02D8
123
+ FA;02D9
124
+ FB;02DA
125
+ FC;00B8
126
+ FD;02DD
127
+ FE;02DB
128
+ FF;02C7
@@ -0,0 +1,40 @@
1
+ 18;02D8
2
+ 19;02C7
3
+ 1A;02C6
4
+ 1B;02D9
5
+ 1C;02DD
6
+ 1D;02DB
7
+ 1E;02DA
8
+ 1F;02DC
9
+ 80;2022
10
+ 81;2020
11
+ 82;2021
12
+ 83;2026
13
+ 84;2014
14
+ 85;2013
15
+ 86;0192
16
+ 87;2044
17
+ 88;2039
18
+ 89;203A
19
+ 8A;2212
20
+ 8B;2030
21
+ 8C;201E
22
+ 8D;201C
23
+ 8E;201D
24
+ 8F;2018
25
+ 90;2019
26
+ 91;201A
27
+ 92;2122
28
+ 93;FB01
29
+ 94;FB02
30
+ 95;0141
31
+ 96;0152
32
+ 97;0160
33
+ 98;0178
34
+ 99;017D
35
+ 9A;0131
36
+ 9B;0142
37
+ 9C;0153
38
+ 9D;0161
39
+ 9E;017E
40
+ A0;20AC
@@ -0,0 +1,47 @@
1
+ 27;2019
2
+ 60;2018
3
+ A4;2044
4
+ A6;0192
5
+ A8;00A4
6
+ A9;0027
7
+ AA;201C
8
+ AC;2039
9
+ AD;203A
10
+ AE;FB01
11
+ AF;FB02
12
+ B1;2013
13
+ B2;2020
14
+ B3;2021
15
+ B4;00B7
16
+ B7;2022
17
+ B8;201A
18
+ B9;201E
19
+ BA;201D
20
+ BC;2026
21
+ BD;2030
22
+ C1;0060
23
+ C2;00B4
24
+ C3;02C6
25
+ C4;02DC
26
+ C5;00AF
27
+ C6;02D8
28
+ C7;02D9
29
+ C8;00A8
30
+ CA;02DA
31
+ CB;00B8
32
+ CD;02DD
33
+ CE;02DB
34
+ CF;02C7
35
+ D0;2014
36
+ E1;00C6
37
+ E3;00AA
38
+ E8;0141
39
+ E9;00D8
40
+ EA;0152
41
+ EB;00BA
42
+ F1;00E6
43
+ F5;0131
44
+ F8;0142
45
+ F9;00F8
46
+ FA;0153
47
+ FB;00DF