image_size 2.0.1 → 2.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/check.yml +40 -0
- data/.rubocop.yml +21 -4
- data/.rubocop_todo.yml +11 -8
- data/CHANGELOG.markdown +17 -0
- data/GPL +340 -0
- data/Gemfile +0 -4
- data/LICENSE.txt +56 -0
- data/README.markdown +6 -8
- data/image_size.gemspec +5 -7
- data/lib/image_size.rb +118 -31
- data/spec/image_size_spec.rb +5 -0
- data/spec/images/cur/32x256.cur +0 -0
- data/spec/images/ico/32x256.ico +0 -0
- data/spec/images/jp2/163x402.jp2 +0 -0
- data/spec/images/jp2/176x373.jpx +0 -0
- data/spec/images/jp2/224x293.j2c +0 -0
- data/spec/images/jpeg/436x429.jpeg +0 -0
- data/spec/images/jpeg/extraneous-bytes.436x429.jpeg +0 -0
- data/spec/images/mng/61x42.mng +0 -0
- data/spec/images/{apng → png}/192x110.apng +0 -0
- data/spec/images/pnm/22x25.pam +8 -0
- data/spec/images/pnm/22x25.pbm +0 -0
- data/spec/images/pnm/22x25.pgm +4 -0
- data/spec/images/pnm/22x25.ppm +4 -0
- data/spec/images/pnm/ascii.22x25.pbm +27 -0
- data/spec/images/pnm/ascii.22x25.pgm +28 -0
- data/spec/images/pnm/ascii.22x25.ppm +28 -0
- data/spec/images/tiff/big-endian.68x49.tiff +0 -0
- data/spec/images/tiff/little-endian.40x68.tiff +0 -0
- metadata +52 -32
- data/.travis.yml +0 -24
- data/spec/images/cur/50x256.cur +0 -0
- data/spec/images/ico/256x27.ico +0 -0
- data/spec/images/jpeg/320x240.jpeg +0 -0
- data/spec/images/jpeg/extraneous-bytes.320x240.jpeg +0 -0
- data/spec/images/mng/612x132.mng +0 -0
- data/spec/images/pbm/85x55.pbm +0 -0
- data/spec/images/pgm/90x55.pgm +0 -5
- data/spec/images/tiff/48x64.tiff +0 -0
data/Gemfile
CHANGED
data/LICENSE.txt
ADDED
@@ -0,0 +1,56 @@
|
|
1
|
+
Ruby is copyrighted free software by Keisuke Minami <keisuke@rccn.com>.
|
2
|
+
You can redistribute it and/or modify it under either the terms of the GPL
|
3
|
+
version 2 (see the file GPL), or the conditions below:
|
4
|
+
|
5
|
+
1. You may make and give away verbatim copies of the source form of the
|
6
|
+
software without restriction, provided that you duplicate all of the
|
7
|
+
original copyright notices and associated disclaimers.
|
8
|
+
|
9
|
+
2. You may modify your copy of the software in any way, provided that
|
10
|
+
you do at least ONE of the following:
|
11
|
+
|
12
|
+
a) place your modifications in the Public Domain or otherwise
|
13
|
+
make them Freely Available, such as by posting said
|
14
|
+
modifications to Usenet or an equivalent medium, or by allowing
|
15
|
+
the author to include your modifications in the software.
|
16
|
+
|
17
|
+
b) use the modified software only within your corporation or
|
18
|
+
organization.
|
19
|
+
|
20
|
+
c) give non-standard binaries non-standard names, with
|
21
|
+
instructions on where to get the original software distribution.
|
22
|
+
|
23
|
+
d) make other distribution arrangements with the author.
|
24
|
+
|
25
|
+
3. You may distribute the software in object code or binary form,
|
26
|
+
provided that you do at least ONE of the following:
|
27
|
+
|
28
|
+
a) distribute the binaries and library files of the software,
|
29
|
+
together with instructions (in the manual page or equivalent)
|
30
|
+
on where to get the original distribution.
|
31
|
+
|
32
|
+
b) accompany the distribution with the machine-readable source of
|
33
|
+
the software.
|
34
|
+
|
35
|
+
c) give non-standard binaries non-standard names, with
|
36
|
+
instructions on where to get the original software distribution.
|
37
|
+
|
38
|
+
d) make other distribution arrangements with the author.
|
39
|
+
|
40
|
+
4. You may modify and include the part of the software into any other
|
41
|
+
software (possibly commercial). But some files in the distribution
|
42
|
+
are not written by the author, so that they are not under these terms.
|
43
|
+
|
44
|
+
For the list of those files and their copying conditions, see the
|
45
|
+
file LEGAL.
|
46
|
+
|
47
|
+
5. The scripts and library files supplied as input to or produced as
|
48
|
+
output from the software do not automatically fall under the
|
49
|
+
copyright of the software, but belong to whomever generated them,
|
50
|
+
and may be sold commercially, and may be aggregated with this
|
51
|
+
software.
|
52
|
+
|
53
|
+
6. THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT ANY EXPRESS OR
|
54
|
+
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
|
55
|
+
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
56
|
+
PURPOSE.
|
data/README.markdown
CHANGED
@@ -1,10 +1,10 @@
|
|
1
|
-
[![Gem Version](https://img.shields.io/gem/v/image_size
|
2
|
-
[![Build Status](https://img.shields.io/
|
1
|
+
[![Gem Version](https://img.shields.io/gem/v/image_size?logo=rubygems)](https://rubygems.org/gems/image_size)
|
2
|
+
[![Build Status](https://img.shields.io/github/workflow/status/toy/image_size/check/master?logo=github)](https://github.com/toy/image_size/actions/workflows/check.yml)
|
3
3
|
|
4
4
|
# image_size
|
5
5
|
|
6
6
|
measure image size using pure Ruby
|
7
|
-
formats: `apng`, `bmp`, `cur`, `gif`, `jpeg`, `
|
7
|
+
formats: `apng`, `bmp`, `cur`, `gif`, `ico`, `j2c`, `jp2`, `jpeg`, `jpx`, `mng`, `pam`, `pbm`, `pcx`, `pgm`, `png`, `ppm`, `psd`, `svg`, `swf`, `tiff`, `webp`, `xbm`, `xpm`
|
8
8
|
|
9
9
|
## Installation
|
10
10
|
|
@@ -85,9 +85,7 @@ end
|
|
85
85
|
|
86
86
|
## Licence
|
87
87
|
|
88
|
-
This code is free to use under the terms of the Ruby's licence.
|
88
|
+
This code is free to use under the terms of the [Ruby's licence](LICENSE.txt).
|
89
89
|
|
90
|
-
|
91
|
-
|
92
|
-
Original author: "Keisuke Minami": mailto:keisuke@rccn.com
|
93
|
-
Further development by Ivan Kuchin https://github.com/toy/image_size
|
90
|
+
Original author: Keisuke Minami <keisuke@rccn.com>.\
|
91
|
+
Further development 2010-2020 Ivan Kuchin https://github.com/toy/image_size
|
data/image_size.gemspec
CHANGED
@@ -2,15 +2,13 @@
|
|
2
2
|
|
3
3
|
Gem::Specification.new do |s|
|
4
4
|
s.name = 'image_size'
|
5
|
-
s.version = '2.
|
5
|
+
s.version = '2.1.2'
|
6
6
|
s.summary = %q{Measure image size using pure Ruby}
|
7
|
-
s.description = %q{Measure following file dimensions: apng, bmp, cur, gif, jpeg,
|
8
|
-
s.homepage = "
|
7
|
+
s.description = %q{Measure following file dimensions: apng, bmp, cur, gif, ico, j2c, jp2, jpeg, jpx, mng, pam, pbm, pcx, pgm, png, ppm, psd, svg, swf, tiff, webp, xbm, xpm}
|
8
|
+
s.homepage = "https://github.com/toy/#{s.name}"
|
9
9
|
s.authors = ['Keisuke Minami', 'Ivan Kuchin']
|
10
10
|
s.license = 'Ruby'
|
11
11
|
|
12
|
-
s.rubyforge_project = s.name
|
13
|
-
|
14
12
|
s.metadata = {
|
15
13
|
'bug_tracker_uri' => "https://github.com/toy/#{s.name}/issues",
|
16
14
|
'changelog_uri' => "https://github.com/toy/#{s.name}/blob/master/CHANGELOG.markdown",
|
@@ -24,7 +22,7 @@ Gem::Specification.new do |s|
|
|
24
22
|
s.require_paths = %w[lib]
|
25
23
|
|
26
24
|
s.add_development_dependency 'rspec', '~> 3.0'
|
27
|
-
if RUBY_VERSION >= '2.
|
28
|
-
s.add_development_dependency 'rubocop', '~> 0
|
25
|
+
if RUBY_VERSION >= '2.4'
|
26
|
+
s.add_development_dependency 'rubocop', '~> 1.0'
|
29
27
|
end
|
30
28
|
end
|
data/lib/image_size.rb
CHANGED
@@ -17,6 +17,7 @@ class ImageSize
|
|
17
17
|
|
18
18
|
class ImageReader # :nodoc:
|
19
19
|
attr_reader :data
|
20
|
+
|
20
21
|
def initialize(data_or_io)
|
21
22
|
@io = if data_or_io.is_a?(String)
|
22
23
|
StringIO.new(data_or_io)
|
@@ -84,28 +85,28 @@ class ImageSize
|
|
84
85
|
private
|
85
86
|
|
86
87
|
SVG_R = /<svg\b([^>]*)>/.freeze
|
88
|
+
XML_R = /<\?xml|<!--/.freeze
|
87
89
|
def detect_format(ir)
|
88
90
|
head = ir[0, 1024]
|
89
91
|
case
|
90
|
-
when head[0, 6] =~ /GIF8[79]a/
|
91
|
-
when head[0, 8] == "\211PNG\r\n\032\n"
|
92
|
-
when head[0, 8] == "\212MNG\r\n\032\n"
|
93
|
-
when head[0, 2] == "\377\330"
|
94
|
-
when head[0, 2] == 'BM'
|
95
|
-
when head[0,
|
96
|
-
when head =~ /\#define\s+\S+\s+\d+/
|
97
|
-
when head[0, 4]
|
98
|
-
when head
|
99
|
-
when head
|
100
|
-
when head[0,
|
101
|
-
when head[0,
|
102
|
-
when head[
|
103
|
-
|
104
|
-
|
105
|
-
when head[0,
|
106
|
-
when head[0, 12]
|
107
|
-
when head[0, 4] == "\
|
108
|
-
when head[0, 4] == "\000\000\002\000" then :cur
|
92
|
+
when head[0, 6] =~ /GIF8[79]a/ then :gif
|
93
|
+
when head[0, 8] == "\211PNG\r\n\032\n" then detect_png_type(ir)
|
94
|
+
when head[0, 8] == "\212MNG\r\n\032\n" then :mng
|
95
|
+
when head[0, 2] == "\377\330" then :jpeg
|
96
|
+
when head[0, 2] == 'BM' then :bmp
|
97
|
+
when head[0, 3] =~ /P[1-6]\s|P7\n/ then detect_pnm_type(ir)
|
98
|
+
when head =~ /\#define\s+\S+\s+\d+/ then :xbm
|
99
|
+
when %W[II*\0 MM\0*].include?(head[0, 4]) then :tiff
|
100
|
+
when head =~ %r{/\* XPM \*/} then :xpm
|
101
|
+
when head[0, 4] == '8BPS' then :psd
|
102
|
+
when head[0, 3] =~ /[FC]WS/ then :swf
|
103
|
+
when head =~ SVG_R || (head =~ XML_R && ir[0, 4096][SVG_R]) then :svg
|
104
|
+
when head[0, 2] =~ /\n[\0-\5]/ then :pcx
|
105
|
+
when head[0, 12] =~ /RIFF(?m:....)WEBP/ then :webp
|
106
|
+
when head[0, 4] == "\0\0\1\0" then :ico
|
107
|
+
when head[0, 4] == "\0\0\2\0" then :cur
|
108
|
+
when head[0, 12] == "\0\0\0\fjP \r\n\207\n" then detect_jpeg2000_type(ir)
|
109
|
+
when head[0, 4] == "\377O\377Q" then :j2c
|
109
110
|
end
|
110
111
|
end
|
111
112
|
|
@@ -122,6 +123,26 @@ private
|
|
122
123
|
:png
|
123
124
|
end
|
124
125
|
|
126
|
+
def detect_pnm_type(ir)
|
127
|
+
case ir[0, 2]
|
128
|
+
when 'P1', 'P4' then :pbm
|
129
|
+
when 'P2', 'P5' then :pgm
|
130
|
+
when 'P3', 'P6' then :ppm
|
131
|
+
when 'P7' then :pam
|
132
|
+
end
|
133
|
+
end
|
134
|
+
|
135
|
+
def detect_jpeg2000_type(ir)
|
136
|
+
return unless ir[16, 4] == 'ftyp'
|
137
|
+
|
138
|
+
# using xl-box would be weird, but doesn't seem to contradict specification
|
139
|
+
skip = ir[12, 4] == "\0\0\0\1" ? 16 : 8
|
140
|
+
case ir[12 + skip, 4]
|
141
|
+
when 'jp2 ' then :jp2
|
142
|
+
when 'jpx ' then :jpx
|
143
|
+
end
|
144
|
+
end
|
145
|
+
|
125
146
|
def size_of_gif(ir)
|
126
147
|
ir[6, 4].unpack('vv')
|
127
148
|
end
|
@@ -143,11 +164,11 @@ private
|
|
143
164
|
end
|
144
165
|
alias_method :size_of_apng, :size_of_png
|
145
166
|
|
146
|
-
JPEG_CODE_CHECK =
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
167
|
+
JPEG_CODE_CHECK = [
|
168
|
+
0xC0, 0xC1, 0xC2, 0xC3,
|
169
|
+
0xC5, 0xC6, 0xC7,
|
170
|
+
0xC9, 0xCA, 0xCB,
|
171
|
+
0xCD, 0xCE, 0xCF
|
151
172
|
].freeze
|
152
173
|
def size_of_jpeg(ir)
|
153
174
|
section_marker = "\xFF"
|
@@ -157,7 +178,7 @@ private
|
|
157
178
|
offset += 1 until section_marker != ir[offset + 1, 1]
|
158
179
|
raise FormatError, 'EOF in JPEG' if ir[offset, 1].nil?
|
159
180
|
|
160
|
-
_marker, code, length = ir[offset, 4].unpack('
|
181
|
+
_marker, code, length = ir[offset, 4].unpack('aCn')
|
161
182
|
offset += 4
|
162
183
|
|
163
184
|
if JPEG_CODE_CHECK.include?(code)
|
@@ -187,12 +208,38 @@ private
|
|
187
208
|
header = ir[0, 1024]
|
188
209
|
header.gsub!(/^\#[^\n\r]*/m, '')
|
189
210
|
header =~ /^(P[1-6])\s+?(\d+)\s+?(\d+)/m
|
190
|
-
case $1
|
191
|
-
when 'P1', 'P4' then @format = :pbm
|
192
|
-
when 'P2', 'P5' then @format = :pgm
|
193
|
-
end
|
194
211
|
[$2.to_i, $3.to_i]
|
195
212
|
end
|
213
|
+
alias_method :size_of_pbm, :size_of_ppm
|
214
|
+
alias_method :size_of_pgm, :size_of_ppm
|
215
|
+
|
216
|
+
def size_of_pam(ir)
|
217
|
+
width = height = nil
|
218
|
+
offset = 3
|
219
|
+
loop do
|
220
|
+
if ir[offset, 1] == '#'
|
221
|
+
offset += 1 until ["\n", '', nil].include?(ir[offset, 1])
|
222
|
+
offset += 1
|
223
|
+
else
|
224
|
+
chunk = ir[offset, 32]
|
225
|
+
case chunk
|
226
|
+
when /\AWIDTH (\d+)\n/
|
227
|
+
width = $1.to_i
|
228
|
+
when /\AHEIGHT (\d+)\n/
|
229
|
+
height = $1.to_i
|
230
|
+
when /\AENDHDR\n/
|
231
|
+
break
|
232
|
+
when /\A(?:DEPTH|MAXVAL) \d+\n/, /\ATUPLTYPE \S+\n/
|
233
|
+
# ignore
|
234
|
+
else
|
235
|
+
raise FormatError, "Unexpected data in PAM header: #{chunk.inspect}"
|
236
|
+
end
|
237
|
+
offset += $&.length
|
238
|
+
break if width && height
|
239
|
+
end
|
240
|
+
end
|
241
|
+
[width, height]
|
242
|
+
end
|
196
243
|
|
197
244
|
def size_of_xbm(ir)
|
198
245
|
ir[0, 1024] =~ /^\#define\s*\S*\s*(\d+)\s*\n\#define\s*\S*\s*(\d+)/mi
|
@@ -247,7 +294,7 @@ private
|
|
247
294
|
end
|
248
295
|
|
249
296
|
def size_of_pcx(ir)
|
250
|
-
parts = ir[4, 8].unpack('
|
297
|
+
parts = ir[4, 8].unpack('v4')
|
251
298
|
[parts[2] - parts[0] + 1, parts[3] - parts[1] + 1]
|
252
299
|
end
|
253
300
|
|
@@ -255,7 +302,7 @@ private
|
|
255
302
|
value_bit_length = ir[8, 1].unpack('B5').first.to_i(2)
|
256
303
|
bit_length = 5 + value_bit_length * 4
|
257
304
|
rect_bits = ir[8, bit_length / 8 + 1].unpack("B#{bit_length}").first
|
258
|
-
values = rect_bits.unpack(
|
305
|
+
values = rect_bits[5..-1].unpack("a#{value_bit_length}" * 4).map{ |bits| bits.to_i(2) }
|
259
306
|
x_min, x_max, y_min, y_max = values
|
260
307
|
[(x_max - x_min) / 20, (y_max - y_min) / 20]
|
261
308
|
end
|
@@ -299,4 +346,44 @@ private
|
|
299
346
|
[(w16 | w8 << 16) + 1, (h16 | h8 << 16) + 1]
|
300
347
|
end
|
301
348
|
end
|
349
|
+
|
350
|
+
def size_of_jp2(ir)
|
351
|
+
offset = 12
|
352
|
+
stop = nil
|
353
|
+
in_header = false
|
354
|
+
loop do
|
355
|
+
break if stop && offset >= stop
|
356
|
+
break if ir[offset, 4] == '' || ir[offset, 4].nil?
|
357
|
+
|
358
|
+
size = ir[offset, 4].unpack('N')[0]
|
359
|
+
type = ir[offset + 4, 4]
|
360
|
+
|
361
|
+
data_offset = 8
|
362
|
+
case size
|
363
|
+
when 1
|
364
|
+
size = ir[offset, 8].unpack('Q>')[0]
|
365
|
+
data_offset = 16
|
366
|
+
raise FormatError, "Unexpected xl-box size #{size}" if (1..15).include?(size)
|
367
|
+
when 2..7
|
368
|
+
raise FormatError, "Reserved box size #{size}"
|
369
|
+
end
|
370
|
+
|
371
|
+
if type == 'jp2h'
|
372
|
+
stop = offset + size unless size.zero?
|
373
|
+
offset += data_offset
|
374
|
+
in_header = true
|
375
|
+
elsif in_header && type == 'ihdr'
|
376
|
+
return ir[offset + data_offset, 8].unpack('NN').reverse
|
377
|
+
else
|
378
|
+
break if size.zero? # box to the end of file
|
379
|
+
|
380
|
+
offset += size
|
381
|
+
end
|
382
|
+
end
|
383
|
+
end
|
384
|
+
alias_method :size_of_jpx, :size_of_jp2
|
385
|
+
|
386
|
+
def size_of_j2c(ir)
|
387
|
+
ir[8, 8].unpack('NN')
|
388
|
+
end
|
302
389
|
end
|
data/spec/image_size_spec.rb
CHANGED
@@ -5,7 +5,12 @@ require 'image_size'
|
|
5
5
|
require 'tempfile'
|
6
6
|
|
7
7
|
describe ImageSize do
|
8
|
+
max_filesize = 16_384
|
9
|
+
|
8
10
|
(Dir['spec/images/*/*.*'] + [__FILE__]).each do |path|
|
11
|
+
filesize = File.size(path)
|
12
|
+
warn "#{path} is too big #{filesize} (max #{max_filesize})" if filesize > max_filesize
|
13
|
+
|
9
14
|
describe "for #{path}" do
|
10
15
|
let(:name){ File.basename(path) }
|
11
16
|
let(:attributes) do
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
Binary file
|
File without changes
|
@@ -0,0 +1,8 @@
|
|
1
|
+
P7
|
2
|
+
WIDTH 22
|
3
|
+
HEIGHT 25
|
4
|
+
DEPTH 3
|
5
|
+
MAXVAL 255
|
6
|
+
TUPLTYPE RGB
|
7
|
+
ENDHDR
|
8
|
+
JMRGJONQVKNSRVZY^b{��|��osyz����Ǎ��v|�������UY_ORT�^_�ts�_b`FH�`aDGLHJPJMQfjnflplqu}�����u{�������nsw[`d]bgqv}aej>AFLLO�`c�ro�bdxORlsvZ_ccknS[^imrwz��������������ɑ��UY]���u{~��glosz~X^b�_^�li�lk���dimORWORWRUZY\a������������������UW\������]`ehmqOPU>AHfOR�lj�kjv}�KNSKOREILEIMTX[LQUAEJHJOZ]a_di���muz������=<BSUZrv|���}pt�jh�liPWZGJOIMPEILDHK=AE`eiuz~������}��������������XZ_MMR[^e�������ed�heHKPPSWFKNAFIMRV`hk���������nuxW\`V[_CHLu|����[^dBBGDHMBEJomr�hf�geJMSZ\aDILekn������dimPUYMNSBBGCDIFGLDEJ]`f���chlDGLT\^EMQ]MQ�ji�ecoehXadJMR���Y]a_afcdjORWKNTMTYJNRFFICCG]`d���z�==BFGLAEK�VX�ki�ec�nrLQWNSZdjmkqtBBHABGPX]^ltScgIMPCDHJJNQTX�����JKPPSX_^d�__�jf�ca�st�_bjX[jsw���^eh=@EIPUQX^RW\UY]JNR@AEegn���v{FFLmuy�]_�ec�gd�ca�zx�zx�po�cg~����y��YZ^CEIEGKSUZejnMRUZ]b���osxADIm[_�_`�ca�ec�db�st�|}�zy�vt�gh�ot�����Ϣ��ehlEGLX]`PRVX[_���dek7<@�RT�b_�a_�`^�ca�ux�{~�|z�yv�{w�rp�ii�����������ntwDDIgjn���`cjSSW�^^�gd�b`�`^�b`�yv�wx�xu�|x�yu�vs�vs�oo�ii�km������FHMimq���QX_x`d�fe�fb�da�b`�ca�wu�rp�vt�us�tr�vs�ts�sr�po�uv�ml�x|V[_gin���OU[�Z\�fc�ea�db�ca�b`�zx�tq�vt�us�wt�vs�wt�sq�rr�st�sq�giTX\SVZ���fbg�ce�eb�ca�ec�db�ec�yu�ur�sq�sr�vs�xu�xs�tq�xt�ws�xt�ihKMRchm���]NP�ge�eb�ca�db�ec�fd�zv�sq�rq�sr�rp�xu�so�rp�tq�qn�uq�bcHIN\bgo|�wQU�jh�fd�ca�b`�ca�ec�zy�xt�tr�vs�sr�sr�tq�sp�rp�kj�mk�^^HLPLOTfqv�UV�jf�ec�db�b`�cb�ca�ss�{w�us�tr�ur�wt�tq�qo�ro�lj�on�ZZ=BFNNTRZ_�YY�ie�db�db�`_�_^�`_�ij�~|�vs�ur�sq�pn�qo�ol�ji�mj�qn�Z]CFL]_dLIN�aa�fb�ca�cb�a`�__�]^x_^�{x�ws�wt�sp�pn�po�lknZ^�lk�pmxXYDINkrwkUX�mj�db�fdX[�Y\�`_�]]�gi�vs�us�xu�tr�nk�lj�nk�jj�mk�kjlPR?CGGIP�bb�pm�fd�da�Y\�]]�b_�`_�ru�ml�ur�wu�tr�pk�lg�oi�oj�pl�kiaMO;@EPGI�kj�he�fd�fc�b`�a^�b`�_^
|
Binary file
|
@@ -0,0 +1,4 @@
|
|
1
|
+
P5
|
2
|
+
22 25
|
3
|
+
255
|
4
|
+
MJQNU]��sÑ{��YRh�mLmGJMikp��z��r_aueALi�rXr^jZmz����ŗX�z�ky]k��hRRU\������W��`lPAT~|NNHHWPEJ]c�t��=Uv�s|VJLHG@dy�������ZM^��v|KSJEQg���t[ZG{�^BHEnx{M\Hj��hTNBDGE`�gGZLQ}yg_M�\adRNSMFC`�~=GE_yzPRipBBWj`LDJT��KS_n~w�i\q�d@OWVXMAg�zFtgz{w���j��ZEGUiQ]�sD_rwyx|���ss�ͩhG\R[�e;]wutw������u����sDj�cSm{vtv��������{w��Hl�We{zxvw����������~{Zi�Te{yxwv�����������qWV�ctywyxy�����������rMg�Qzywxyz�����������lIazY~zwvwy���������~�gKOo_yxvww~���������cANYe~xxutup�������w�cF_Jq{wxvtsd������x_�_HqZ�xzahvrm�����{�~VBIl�zweowu{{�������~Q?I||zzwuvt
|
@@ -0,0 +1,4 @@
|
|
1
|
+
P6
|
2
|
+
22 25
|
3
|
+
255
|
4
|
+
JMRGJONQVKNSRVZY^b{��|��osyz����Ǎ��v|�������UY_ORT�^_�ts�_b`FH�`aDGLHJPJMQfjnflplqu}�����u{�������nsw[`d]bgqv}aej>AFLLO�`c�ro�bdxORlsvZ_ccknS[^imrwz��������������ɑ��UY]���u{~��glosz~X^b�_^�li�lk���dimORWORWRUZY\a������������������UW\������]`ehmqOPU>AHfOR�lj�kjv}�KNSKOREILEIMTX[LQUAEJHJOZ]a_di���muz������=<BSUZrv|���}pt�jh�liPWZGJOIMPEILDHK=AE`eiuz~������}��������������XZ_MMR[^e�������ed�heHKPPSWFKNAFIMRV`hk���������nuxW\`V[_CHLu|����[^dBBGDHMBEJomr�hf�geJMSZ\aDILekn������dimPUYMNSBBGCDIFGLDEJ]`f���chlDGLT\^EMQ]MQ�ji�ecoehXadJMR���Y]a_afcdjORWKNTMTYJNRFFICCG]`d���z�==BFGLAEK�VX�ki�ec�nrLQWNSZdjmkqtBBHABGPX]^ltScgIMPCDHJJNQTX�����JKPPSX_^d�__�jf�ca�st�_bjX[jsw���^eh=@EIPUQX^RW\UY]JNR@AEegn���v{FFLmuy�]_�ec�gd�ca�zx�zx�po�cg~����y��YZ^CEIEGKSUZejnMRUZ]b���osxADIm[_�_`�ca�ec�db�st�|}�zy�vt�gh�ot�����Ϣ��ehlEGLX]`PRVX[_���dek7<@�RT�b_�a_�`^�ca�ux�{~�|z�yv�{w�rp�ii�����������ntwDDIgjn���`cjSSW�^^�gd�b`�`^�b`�yv�wx�xu�|x�yu�vs�vs�oo�ii�km������FHMimq���QX_x`d�fe�fb�da�b`�ca�wu�rp�vt�us�tr�vs�ts�sr�po�uv�ml�x|V[_gin���OU[�Z\�fc�ea�db�ca�b`�zx�tq�vt�us�wt�vs�wt�sq�rr�st�sq�giTX\SVZ���fbg�ce�eb�ca�ec�db�ec�yu�ur�sq�sr�vs�xu�xs�tq�xt�ws�xt�ihKMRchm���]NP�ge�eb�ca�db�ec�fd�zv�sq�rq�sr�rp�xu�so�rp�tq�qn�uq�bcHIN\bgo|�wQU�jh�fd�ca�b`�ca�ec�zy�xt�tr�vs�sr�sr�tq�sp�rp�kj�mk�^^HLPLOTfqv�UV�jf�ec�db�b`�cb�ca�ss�{w�us�tr�ur�wt�tq�qo�ro�lj�on�ZZ=BFNNTRZ_�YY�ie�db�db�`_�_^�`_�ij�~|�vs�ur�sq�pn�qo�ol�ji�mj�qn�Z]CFL]_dLIN�aa�fb�ca�cb�a`�__�]^x_^�{x�ws�wt�sp�pn�po�lknZ^�lk�pmxXYDINkrwkUX�mj�db�fdX[�Y\�`_�]]�gi�vs�us�xu�tr�nk�lj�nk�jj�mk�kjlPR?CGGIP�bb�pm�fd�da�Y\�]]�b_�`_�ru�ml�ur�wu�tr�pk�lg�oi�oj�pl�kiaMO;@EPGI�kj�he�fd�fc�b`�a^�b`�_^
|
@@ -0,0 +1,27 @@
|
|
1
|
+
P1
|
2
|
+
22 25
|
3
|
+
1 1 1 1 1 1 1 0 1 0 0 0 0 0 0 1 1 1 1 1 1 1
|
4
|
+
1 1 1 1 1 1 0 0 1 0 0 0 0 1 0 1 1 1 1 1 1 1
|
5
|
+
1 1 1 1 1 1 0 0 0 0 0 0 1 0 1 0 1 1 1 1 1 0
|
6
|
+
1 1 1 1 1 1 0 0 0 0 0 0 1 0 0 1 1 1 1 1 0 1
|
7
|
+
1 1 1 1 1 1 1 1 1 1 1 0 1 0 0 1 1 1 1 1 1 0
|
8
|
+
1 1 1 1 1 1 1 1 0 0 1 1 0 0 0 1 1 1 0 0 1 1
|
9
|
+
1 1 1 1 1 1 0 0 0 1 1 1 1 0 0 1 1 1 1 1 0 1
|
10
|
+
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 0
|
11
|
+
1 1 1 0 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
|
12
|
+
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 1 1 1 1 1 1 1
|
13
|
+
1 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 1 1 1 0 0 0
|
14
|
+
0 1 0 1 1 0 0 0 1 1 1 1 1 0 0 0 1 1 1 1 1 1
|
15
|
+
1 0 0 0 1 1 0 0 0 1 1 1 1 1 0 1 1 1 1 1 0 1
|
16
|
+
0 0 1 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 1 1 1 1
|
17
|
+
0 0 0 0 0 0 0 1 0 0 0 0 1 0 0 1 1 1 0 1 1 0
|
18
|
+
0 0 1 0 1 0 0 0 1 0 1 1 1 1 0 1 1 0 1 0 1 1
|
19
|
+
1 0 0 1 0 1 0 0 1 0 0 1 1 1 0 1 1 1 0 1 1 0
|
20
|
+
0 0 0 0 0 0 0 1 0 0 0 1 1 1 1 1 1 0 1 0 0 1
|
21
|
+
1 0 1 1 0 1 0 1 0 1 0 1 1 1 1 1 0 1 1 1 0 1
|
22
|
+
0 0 0 0 0 0 0 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1
|
23
|
+
1 0 0 1 1 0 1 0 0 1 0 1 1 1 1 1 1 0 0 1 1 1
|
24
|
+
1 0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 0 1 1 1 0 1
|
25
|
+
1 0 0 0 0 1 0 1 1 0 1 1 1 1 1 0 1 0 1 1 1 1
|
26
|
+
1 0 1 0 0 0 1 0 1 1 1 1 1 1 1 1 0 1 1 1 0 0
|
27
|
+
1 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 1 0 1 1 0
|
@@ -0,0 +1,28 @@
|
|
1
|
+
P2
|
2
|
+
22 25
|
3
|
+
255
|
4
|
+
77 74 81 78 85 93 129 129 115 127 195 145 123 169 147 89 82 104 135 109 76 109
|
5
|
+
71 74 77 105 107 112 132 169 122 151 204 114 95 97 117 101 65 76 105 133 114 88
|
6
|
+
114 94 106 90 109 122 165 164 178 187 197 151 88 134 122 130 107 121 93 107 128 127
|
7
|
+
158 104 82 82 85 92 144 155 154 180 157 183 87 182 145 96 108 80 65 84 127 126
|
8
|
+
124 78 78 72 72 87 80 69 74 93 99 157 116 160 139 61 85 118 141 115 124 127
|
9
|
+
86 74 76 72 71 64 100 121 139 170 132 142 154 182 160 90 77 94 142 145 118 124
|
10
|
+
75 83 74 69 81 103 137 170 158 116 91 90 71 123 173 94 66 72 69 110 120 123
|
11
|
+
77 92 72 106 138 140 104 84 78 66 68 71 69 96 161 103 71 90 76 81 125 121
|
12
|
+
103 95 77 134 92 97 100 82 78 83 77 70 67 96 185 126 61 71 69 95 127 121
|
13
|
+
122 80 82 105 112 66 66 87 106 96 76 68 74 84 180 130 75 83 95 110 126 119
|
14
|
+
131 105 92 113 140 100 64 79 87 86 88 77 65 103 189 122 70 116 103 122 123 119
|
15
|
+
138 138 128 106 127 158 128 90 69 71 85 105 81 93 191 115 68 95 114 119 121 120
|
16
|
+
124 142 140 137 115 115 168 205 169 104 71 92 82 91 185 101 59 93 119 117 116 119
|
17
|
+
131 140 140 138 140 131 117 132 146 166 148 115 68 106 192 99 83 109 123 118 116 118
|
18
|
+
138 137 137 140 138 135 136 129 123 119 138 140 72 108 178 87 101 123 122 120 118 119
|
19
|
+
136 132 136 135 134 135 134 134 128 133 126 123 90 105 177 84 101 123 121 120 119 118
|
20
|
+
138 134 136 135 136 135 136 133 131 132 134 113 87 86 163 99 116 121 119 121 120 121
|
21
|
+
137 134 133 133 135 137 137 134 137 136 138 114 77 103 147 81 122 121 119 120 121 122
|
22
|
+
139 133 132 132 129 137 132 132 134 131 135 108 73 97 122 89 126 122 119 118 119 121
|
23
|
+
137 137 134 135 133 133 134 133 132 126 129 103 75 79 111 95 127 121 120 118 119 119
|
24
|
+
126 140 135 134 134 136 134 131 133 127 131 99 65 78 89 101 126 120 120 117 116 117
|
25
|
+
112 143 135 134 133 130 132 129 119 127 133 99 70 95 74 113 123 119 120 118 116 115
|
26
|
+
100 139 136 136 133 131 132 120 95 127 132 95 72 113 90 128 120 122 97 104 118 114
|
27
|
+
109 133 135 137 134 128 127 127 123 128 126 86 66 73 108 131 122 119 101 111 119 117
|
28
|
+
123 123 135 136 134 130 127 129 129 130 126 81 63 73 124 124 122 122 119 117 118 116
|