term-ansicolor 1.1.5 → 1.2.0

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.
@@ -0,0 +1,96 @@
1
+ module Term
2
+ module ANSIColor
3
+ class PPMReader
4
+ include Term::ANSIColor
5
+
6
+ def initialize(io, options = {})
7
+ @io = io
8
+ @options = options
9
+ @buffer = ''
10
+ end
11
+
12
+ def reset_io
13
+ begin
14
+ @io.rewind
15
+ rescue Errno::ESPIPE
16
+ end
17
+ parse_header
18
+ end
19
+
20
+ def each_row
21
+ reset_io
22
+ @height.times do
23
+ yield parse_row
24
+ end
25
+ end
26
+
27
+ def to_a
28
+ enum_for(:each_row).to_a
29
+ end
30
+
31
+ def to_s
32
+ result = ''
33
+ each_row do |row|
34
+ last_pixel = nil
35
+ for pixel in row
36
+ if pixel != last_pixel
37
+ color = Attribute.nearest_rgb_color(pixel, @options)
38
+ result << on_color(color)
39
+ last_pixel = pixel
40
+ end
41
+ result << ' '
42
+ end
43
+ result << reset << "\n"
44
+ end
45
+ result
46
+ end
47
+
48
+ private
49
+
50
+ def parse_row
51
+ row = []
52
+ @width.times do
53
+ row << parse_next_pixel
54
+ end
55
+ row
56
+ end
57
+
58
+ def parse_next_pixel
59
+ pixel = nil
60
+ case @type
61
+ when 3
62
+ @buffer.empty? and @buffer << next_line
63
+ @buffer.sub!(/(\d+)\s+(\d+)\s+(\d+)\s*/) do
64
+ pixel = [ $1.to_i, $2.to_i, $3.to_i ]
65
+ ''
66
+ end
67
+ when 6
68
+ @buffer.size < 3 and @buffer << @io.read(8192)
69
+ pixel = @buffer.slice!(0, 3).unpack('C3')
70
+ end
71
+ pixel
72
+ end
73
+
74
+ def parse_header
75
+ (line = next_line) =~ /^P([36])$/ or raise "unknown type #{line.to_s.chomp.inspect}"
76
+ @type = $1.to_i
77
+
78
+ if next_line =~ /^(\d+)\s+(\d+)$/
79
+ @width, @height = $1.to_i, $2.to_i
80
+ else
81
+ raise "missing dimensions"
82
+ end
83
+
84
+ unless next_line =~ /^255$/
85
+ raise "only 255 max color images allowed"
86
+ end
87
+ end
88
+
89
+ def next_line
90
+ while line = @io.gets and line =~ /^#|^\s$/
91
+ end
92
+ line
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,161 @@
1
+ module Term
2
+ module ANSIColor
3
+ module RGBColorMetricsHelpers
4
+ module WeightedEuclideanDistance
5
+ def weighted_euclidean_distance_to(other, weights = [ 1.0 ] * values.size)
6
+ sum = 0.0
7
+ values.zip(other.values, weights) do |s, o, w|
8
+ sum += w * (s - o) ** 2
9
+ end
10
+ Math.sqrt(sum)
11
+ end
12
+ end
13
+
14
+ module NormalizeRGBTriple
15
+ private
16
+
17
+ def normalize(v)
18
+ v /= 255.0
19
+ if v <= 0.04045
20
+ v / 12
21
+ else
22
+ ( (v + 0.055) / 1.055) ** 2.4
23
+ end
24
+ end
25
+
26
+ def normalize_rgb_triple(rgb_triple)
27
+ r, g, b = [
28
+ rgb_triple.red,
29
+ rgb_triple.green,
30
+ rgb_triple.blue
31
+ ].map { |v| normalize(v) }
32
+ end
33
+ end
34
+ end
35
+
36
+ module RGBColorMetrics
37
+ def self.metric(name)
38
+ metric?(name) or raise ArgumentError, "unknown metric #{name.inspect}"
39
+ end
40
+
41
+ def self.metric?(name)
42
+ if const_defined?(name)
43
+ const_get name
44
+ end
45
+ end
46
+
47
+ def self.metrics
48
+ constants.map(&:to_sym)
49
+ end
50
+
51
+ # Implements color distance how the old greeks and most donkeys would…
52
+ module Euclidean
53
+ def self.distance(rgb1, rgb2)
54
+ rgb1.weighted_euclidean_distance_to rgb2
55
+ end
56
+ end
57
+
58
+ # Implements color distance the best way everybody knows…
59
+ module NTSC
60
+ def self.distance(rgb1, rgb2)
61
+ rgb1.weighted_euclidean_distance_to rgb2, [ 0.299, 0.587, 0.114 ]
62
+ end
63
+ end
64
+
65
+ # Implements color distance as given in:
66
+ # http://www.compuphase.com/cmetric.htm
67
+ module CompuPhase
68
+ def self.distance(rgb1, rgb2)
69
+ rmean = (rgb1.red + rgb2.red) / 2
70
+ rgb1.weighted_euclidean_distance_to rgb2,
71
+ [ 2 + (rmean >> 8), 4, 2 + ((255 - rmean) >> 8) ]
72
+ end
73
+ end
74
+
75
+ module YUV
76
+ class YUVTriple < Struct.new(:y, :u, :v)
77
+ include RGBColorMetricsHelpers::WeightedEuclideanDistance
78
+
79
+ def self.from_rgb_triple(rgb_triple)
80
+ r, g, b = rgb_triple.red, rgb_triple.green, rgb_triple.blue
81
+ y = (0.299 * r + 0.587 * g + 0.114 * b).round
82
+ u = ((b - y) * 0.492).round
83
+ v = ((r - y) * 0.877).round
84
+ new(y, u, v)
85
+ end
86
+ end
87
+
88
+ def self.distance(rgb1, rgb2)
89
+ yuv1 = YUVTriple.from_rgb_triple(rgb1)
90
+ yuv2 = YUVTriple.from_rgb_triple(rgb2)
91
+ yuv1.weighted_euclidean_distance_to yuv2
92
+ end
93
+ end
94
+
95
+ module CIEXYZ
96
+ class CIEXYZTriple < Struct.new(:x, :y, :z)
97
+ include RGBColorMetricsHelpers::WeightedEuclideanDistance
98
+ extend RGBColorMetricsHelpers::NormalizeRGBTriple
99
+
100
+ def self.from_rgb_triple(rgb_triple)
101
+ r, g, b = normalize_rgb_triple rgb_triple
102
+
103
+ x = 0.436052025 * r + 0.385081593 * g + 0.143087414 * b
104
+ y = 0.222491598 * r + 0.71688606 * g + 0.060621486 * b
105
+ z = 0.013929122 * r + 0.097097002 * g + 0.71418547 * b
106
+
107
+ x *= 255
108
+ y *= 255
109
+ z *= 255
110
+
111
+ new(x.round, y.round, z.round)
112
+ end
113
+ end
114
+
115
+ def self.distance(rgb1, rgb2)
116
+ xyz1 = CIEXYZTriple.from_rgb_triple(rgb1)
117
+ xyz2 = CIEXYZTriple.from_rgb_triple(rgb2)
118
+ xyz1.weighted_euclidean_distance_to xyz2
119
+ end
120
+ end
121
+
122
+ module CIELab
123
+ class CIELabTriple < Struct.new(:l, :a, :b)
124
+ include RGBColorMetricsHelpers::WeightedEuclideanDistance
125
+ extend RGBColorMetricsHelpers::NormalizeRGBTriple
126
+
127
+ def self.from_rgb_triple(rgb_triple)
128
+ r, g, b = normalize_rgb_triple rgb_triple
129
+
130
+ x = 0.436052025 * r + 0.385081593 * g + 0.143087414 * b
131
+ y = 0.222491598 * r + 0.71688606 * g + 0.060621486 * b
132
+ z = 0.013929122 * r + 0.097097002 * g + 0.71418547 * b
133
+
134
+ xr = x / 0.964221
135
+ yr = y
136
+ zr = z / 0.825211
137
+
138
+ eps = 216.0 / 24389
139
+ k = 24389.0 / 27
140
+
141
+ fx = xr > eps ? xr ** (1.0 / 3) : (k * xr + 16) / 116
142
+ fy = yr > eps ? yr ** (1.0 / 3) : (k * yr + 16) / 116
143
+ fz = zr > eps ? zr ** (1.0 / 3) : (k * zr + 16) / 116
144
+
145
+ l = 2.55 * ((116 * fy) - 16)
146
+ a = 500 * (fx - fy)
147
+ b = 200 * (fy - fz)
148
+
149
+ new(l.round, a.round, b.round)
150
+ end
151
+ end
152
+
153
+ def self.distance(rgb1, rgb2)
154
+ lab1 = CIELabTriple.from_rgb_triple(rgb1)
155
+ lab2 = CIELabTriple.from_rgb_triple(rgb2)
156
+ lab1.weighted_euclidean_distance_to lab2
157
+ end
158
+ end
159
+ end
160
+ end
161
+ end
@@ -1,6 +1,10 @@
1
+ require 'term/ansicolor/rgb_color_metrics'
2
+
1
3
  module Term
2
4
  module ANSIColor
3
5
  class RGBTriple
6
+ include Term::ANSIColor::RGBColorMetricsHelpers::WeightedEuclideanDistance
7
+
4
8
  def self.convert_value(color)
5
9
  color.nil? and raise ArgumentError, "missing color value"
6
10
  color = Integer(color)
@@ -58,6 +62,10 @@ module Term
58
62
  @values[2]
59
63
  end
60
64
 
65
+ def gray?
66
+ red != 0 && red != 0xff && red == green && green == blue && blue == red
67
+ end
68
+
61
69
  def html
62
70
  s = '#'
63
71
  @values.each { |c| s << '%02x' % c }
@@ -79,12 +87,34 @@ module Term
79
87
  @values == other.values
80
88
  end
81
89
 
82
- def distance_to(other)
83
- Math.sqrt(
84
- ((red - other.red) * 0.299) ** 2 +
85
- ((green - other.green) * 0.587) ** 2 +
86
- ((blue - other.blue) * 0.114) ** 2
87
- )
90
+ def distance_to(other, options = {})
91
+ options[:metric] ||= RGBColorMetrics::CIELab
92
+ options[:metric].distance(self, other)
93
+ end
94
+
95
+ def initialize_copy(other)
96
+ r = super
97
+ other.instance_variable_set :@values, @values.dup
98
+ r
99
+ end
100
+
101
+ def gradient_to(other, options = {})
102
+ options[:steps] ||= 16
103
+ steps = options[:steps].to_i
104
+ steps < 2 and raise ArgumentError, 'at least 2 steps are required'
105
+ changes = other.values.zip(@values).map { |x, y| x - y }
106
+ current = self
107
+ gradient = [ current.dup ]
108
+ s = steps - 1
109
+ while s > 1
110
+ current = current.dup
111
+ gradient << current
112
+ 3.times do |i|
113
+ current.values[i] += changes[i] / (steps - 1)
114
+ end
115
+ s -= 1
116
+ end
117
+ gradient << other
88
118
  end
89
119
  end
90
120
  end
@@ -1,6 +1,6 @@
1
1
  module Term::ANSIColor
2
2
  # Term::ANSIColor version
3
- VERSION = '1.1.5'
3
+ VERSION = '1.2.0'
4
4
  VERSION_ARRAY = VERSION.split('.').map(&:to_i) # :nodoc:
5
5
  VERSION_MAJOR = VERSION_ARRAY[0] # :nodoc:
6
6
  VERSION_MINOR = VERSION_ARRAY[1] # :nodoc:
@@ -2,36 +2,40 @@
2
2
 
3
3
  Gem::Specification.new do |s|
4
4
  s.name = "term-ansicolor"
5
- s.version = "1.1.5"
5
+ s.version = "1.2.0"
6
6
 
7
7
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
8
8
  s.authors = ["Florian Frank"]
9
- s.date = "2013-04-18"
9
+ s.date = "2013-05-16"
10
10
  s.description = "This library uses ANSI escape sequences to control the attributes of terminal output"
11
11
  s.email = "flori@ping.de"
12
- s.executables = ["cdiff", "decolor", "colortab"]
13
- s.extra_rdoc_files = ["README.rdoc", "lib/term/ansicolor.rb", "lib/term/ansicolor/attribute.rb", "lib/term/ansicolor/rgb_triple.rb", "lib/term/ansicolor/version.rb"]
14
- s.files = [".gitignore", ".travis.yml", "CHANGES", "COPYING", "Gemfile", "README.rdoc", "Rakefile", "VERSION", "bin/cdiff", "bin/colortab", "bin/decolor", "examples/example.rb", "lib/term/ansicolor.rb", "lib/term/ansicolor/.keep", "lib/term/ansicolor/attribute.rb", "lib/term/ansicolor/rgb_triple.rb", "lib/term/ansicolor/version.rb", "term-ansicolor.gemspec", "tests/ansicolor_test.rb", "tests/attribute_test.rb", "tests/rgb_triple_test.rb", "tests/test_helper.rb"]
12
+ s.executables = ["cdiff", "decolor", "colortab", "term_mandel", "term_display"]
13
+ s.extra_rdoc_files = ["README.rdoc", "lib/term/ansicolor.rb", "lib/term/ansicolor/attribute.rb", "lib/term/ansicolor/ppm_reader.rb", "lib/term/ansicolor/rgb_color_metrics.rb", "lib/term/ansicolor/rgb_triple.rb", "lib/term/ansicolor/version.rb"]
14
+ s.files = [".gitignore", ".travis.yml", "CHANGES", "COPYING", "Gemfile", "README.rdoc", "Rakefile", "VERSION", "bin/cdiff", "bin/colortab", "bin/decolor", "bin/term_display", "bin/term_mandel", "examples/ColorTest.gif", "examples/Mona_Lisa.jpg", "examples/Stilleben.jpg", "examples/example.rb", "examples/lambda-red-plain.ppm", "examples/lambda-red.png", "examples/lambda-red.ppm", "examples/pacman.jpg", "examples/smiley.png", "examples/smiley.txt", "examples/wool.jpg", "lib/term/ansicolor.rb", "lib/term/ansicolor/.keep", "lib/term/ansicolor/attribute.rb", "lib/term/ansicolor/ppm_reader.rb", "lib/term/ansicolor/rgb_color_metrics.rb", "lib/term/ansicolor/rgb_triple.rb", "lib/term/ansicolor/version.rb", "term-ansicolor.gemspec", "tests/ansicolor_test.rb", "tests/attribute_test.rb", "tests/ppm_reader_test.rb", "tests/rgb_color_metrics_test.rb", "tests/rgb_triple_test.rb", "tests/test_helper.rb"]
15
15
  s.homepage = "http://flori.github.com/term-ansicolor"
16
16
  s.licenses = ["GPL-2"]
17
+ s.post_install_message = "\e[48;5;0m \e[48;5;0m \e[48;5;232m \e[48;5;234m \e[48;5;235m \e[48;5;236m \e[48;5;236m \e[48;5;236m \e[48;5;235m \e[48;5;234m \e[48;5;0m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;235m \e[48;5;58m \e[48;5;100m \e[48;5;143m \e[48;5;142m \e[48;5;185m \e[48;5;185m \e[48;5;185m \e[48;5;184m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;184m \e[48;5;184m \e[48;5;142m \e[48;5;142m \e[48;5;142m \e[48;5;2m \e[48;5;58m \e[48;5;234m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;234m \e[48;5;101m \e[48;5;143m \e[48;5;185m \e[48;5;185m \e[48;5;228m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;184m \e[48;5;142m \e[48;5;100m \e[48;5;58m \e[48;5;233m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;0m \e[48;5;59m \e[48;5;143m \e[48;5;186m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;184m \e[48;5;100m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;240m \e[48;5;143m \e[48;5;186m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;142m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;233m \e[48;5;101m \e[48;5;186m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;2m \e[48;5;232m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;233m \e[48;5;101m \e[48;5;186m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;100m \e[48;5;232m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;0m \e[48;5;101m \e[48;5;186m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;236m \e[48;5;143m \e[48;5;228m \e[48;5;228m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;185m \e[48;5;185m \e[48;5;143m \e[48;5;185m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;142m \e[48;5;184m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;235m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;58m \e[48;5;185m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;229m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;185m \e[48;5;58m \e[48;5;0m \e[48;5;236m \e[48;5;142m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;236m \e[48;5;0m \e[48;5;58m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;101m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;237m \e[48;5;0m \e[48;5;142m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;0m \e[48;5;58m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;58m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;143m \e[48;5;0m \e[48;5;58m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;58m \e[48;5;0m \e[48;5;142m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;238m \e[48;5;185m \e[48;5;227m \e[48;5;227m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;143m \e[48;5;0m \e[48;5;58m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;58m \e[48;5;0m \e[48;5;142m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;237m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;0m \e[48;5;185m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;228m \e[48;5;228m \e[48;5;228m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;237m \e[48;5;0m \e[48;5;142m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;0m \e[48;5;58m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;58m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;185m \e[48;5;58m \e[48;5;0m \e[48;5;236m \e[48;5;142m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;236m \e[48;5;0m \e[48;5;58m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;142m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;184m \e[48;5;185m \e[48;5;142m \e[48;5;184m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;142m \e[48;5;184m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;0m \e[48;5;184m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;232m \e[48;5;184m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;232m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;232m \e[48;5;184m \e[48;5;227m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;232m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;0m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;142m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;2m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;100m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;58m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;100m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;100m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;142m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;184m \e[48;5;142m \e[48;5;142m \e[48;5;100m \e[48;5;58m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;100m \e[48;5;142m \e[48;5;142m \e[48;5;184m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;237m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;235m \e[48;5;142m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;235m \e[48;5;142m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;237m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;58m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;58m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;58m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;58m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;236m \e[48;5;58m \e[48;5;142m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;58m \e[48;5;236m \e[48;5;142m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;58m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;58m \e[48;5;232m \e[48;5;2m \e[48;5;142m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;142m \e[48;5;2m \e[48;5;232m \e[48;5;58m \e[48;5;142m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;235m \e[48;5;142m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;142m \e[48;5;58m \e[48;5;232m \e[48;5;236m \e[48;5;2m \e[48;5;142m \e[48;5;184m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;184m \e[48;5;142m \e[48;5;2m \e[48;5;236m \e[48;5;232m \e[48;5;58m \e[48;5;142m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;142m \e[48;5;235m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;58m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;142m \e[48;5;100m \e[48;5;58m \e[48;5;232m \e[48;5;0m \e[48;5;232m \e[48;5;237m \e[48;5;58m \e[48;5;58m \e[48;5;2m \e[48;5;2m \e[48;5;2m \e[48;5;58m \e[48;5;58m \e[48;5;237m \e[48;5;232m \e[48;5;0m \e[48;5;232m \e[48;5;58m \e[48;5;100m \e[48;5;142m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;232m \e[48;5;100m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;184m \e[48;5;184m \e[48;5;142m \e[48;5;142m \e[48;5;142m \e[48;5;142m \e[48;5;142m \e[48;5;184m \e[48;5;184m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;100m \e[48;5;232m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;232m \e[48;5;2m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;2m \e[48;5;232m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;58m \e[48;5;142m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;142m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;58m \e[48;5;100m \e[48;5;184m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;184m \e[48;5;100m \e[48;5;58m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;233m \e[48;5;58m \e[48;5;100m \e[48;5;142m \e[48;5;184m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;184m \e[48;5;142m \e[48;5;100m \e[48;5;58m \e[48;5;233m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;234m \e[48;5;58m \e[48;5;2m \e[48;5;142m \e[48;5;142m \e[48;5;142m \e[48;5;184m \e[48;5;184m \e[48;5;184m \e[48;5;184m \e[48;5;11m \e[48;5;11m \e[48;5;11m \e[48;5;184m \e[48;5;184m \e[48;5;184m \e[48;5;184m \e[48;5;142m \e[48;5;142m \e[48;5;142m \e[48;5;2m \e[48;5;58m \e[48;5;234m \e[48;5;0m \e[0m\n\e[48;5;0m \e[48;5;0m \e[48;5;233m \e[48;5;235m \e[48;5;235m \e[48;5;236m \e[48;5;235m \e[48;5;235m \e[48;5;233m \e[48;5;0m \e[48;5;0m \e[0m\n"
17
18
  s.rdoc_options = ["--title", "Term-ansicolor - Ruby library that colors strings using ANSI escape sequences", "--main", "README.rdoc"]
18
19
  s.require_paths = ["lib"]
19
20
  s.rubygems_version = "2.0.3"
20
21
  s.summary = "Ruby library that colors strings using ANSI escape sequences"
21
- s.test_files = ["tests/ansicolor_test.rb", "tests/attribute_test.rb", "tests/rgb_triple_test.rb", "tests/test_helper.rb"]
22
+ s.test_files = ["tests/ansicolor_test.rb", "tests/attribute_test.rb", "tests/ppm_reader_test.rb", "tests/rgb_color_metrics_test.rb", "tests/rgb_triple_test.rb", "tests/test_helper.rb"]
22
23
 
23
24
  if s.respond_to? :specification_version then
24
25
  s.specification_version = 4
25
26
 
26
27
  if Gem::Version.new(Gem::VERSION) >= Gem::Version.new('1.2.0') then
27
- s.add_development_dependency(%q<gem_hadar>, ["~> 0.3.0"])
28
+ s.add_development_dependency(%q<gem_hadar>, ["~> 0.3.1"])
28
29
  s.add_development_dependency(%q<simplecov>, [">= 0"])
30
+ s.add_runtime_dependency(%q<tins>, ["~> 0.8"])
29
31
  else
30
- s.add_dependency(%q<gem_hadar>, ["~> 0.3.0"])
32
+ s.add_dependency(%q<gem_hadar>, ["~> 0.3.1"])
31
33
  s.add_dependency(%q<simplecov>, [">= 0"])
34
+ s.add_dependency(%q<tins>, ["~> 0.8"])
32
35
  end
33
36
  else
34
- s.add_dependency(%q<gem_hadar>, ["~> 0.3.0"])
37
+ s.add_dependency(%q<gem_hadar>, ["~> 0.3.1"])
35
38
  s.add_dependency(%q<simplecov>, [">= 0"])
39
+ s.add_dependency(%q<tins>, ["~> 0.8"])
36
40
  end
37
41
  end
@@ -1,4 +1,4 @@
1
- require File.expand_path('test_helper', File.dirname(__FILE__))
1
+ require 'test_helper'
2
2
 
3
3
  class String
4
4
  include Term::ANSIColor
@@ -1,4 +1,4 @@
1
- require File.expand_path('test_helper', File.dirname(__FILE__))
1
+ require 'test_helper'
2
2
 
3
3
  class AttributeTest < Test::Unit::TestCase
4
4
  include Term::ANSIColor
@@ -11,23 +11,63 @@ class AttributeTest < Test::Unit::TestCase
11
11
  assert_equal color, Attribute[123]
12
12
  assert_equal color, Attribute['123']
13
13
  assert_equal color, Attribute['#87ffff']
14
+ assert_equal color, Attribute[ [ 0x87, 0xff, 0xff ] ]
14
15
  assert_equal on_color, Attribute['on_123']
15
16
  assert_equal on_color, Attribute['on_#87ffff']
16
17
  end
17
18
 
19
+ def test_gray
20
+ a1 = Attribute[ [ 0, 0, 0 ] ]
21
+ assert_equal false, a1.gray?
22
+ a2 = Attribute[ [ 255, 255, 255 ] ]
23
+ assert_equal false, a2.gray?
24
+ a3 = Attribute[ [ 00, 0x7f, 0xff ] ]
25
+ assert_equal false, a3.gray?
26
+ a4 = Attribute[ [ 0x7f, 0x7f, 0x7f ] ]
27
+ assert_equal true, a4.gray?
28
+ end
29
+
18
30
  def test_distance_to
19
- assert_in_delta 149.685, Attribute.get(:color0).distance_to(Attribute.nearest_rgb_color('#0f0')), 1e-3
31
+ color = Attribute.nearest_rgb_color('#0f0')
32
+ assert_in_delta 250.954, Attribute.get(:color0).distance_to(color), 1e-3
33
+ color = Attribute.nearest_rgb_color('#0f0')
34
+ assert_in_delta 255, Attribute.get(:color0).distance_to(color,
35
+ :metric => RGBColorMetrics::Euclidean), 1e-3
20
36
  assert_equal 1 / 0.0, Attribute.get(:color0).distance_to(nil)
21
37
  end
22
38
 
23
39
  def test_nearest_rgb_color
24
40
  assert_equal Attribute.get(:color0).rgb, Attribute.nearest_rgb_color('#000').rgb
25
41
  assert_equal Attribute.get(:color15).rgb, Attribute.nearest_rgb_color('#ffffff').rgb
42
+ assert_equal :color247, Attribute.nearest_rgb_color('#aaa').name
43
+ assert_equal :color109, Attribute.nearest_rgb_color('#aaa', :gray => false).name
26
44
  end
27
45
 
28
46
  def test_nearest_rgb_on_color
29
47
  assert_equal Attribute.get(:on_color0).rgb, Attribute.nearest_rgb_on_color('#000').rgb
30
48
  assert_equal Attribute.get(:on_color15).rgb, Attribute.nearest_rgb_on_color('#ffffff').rgb
49
+ assert_equal :on_color247, Attribute.nearest_rgb_on_color('#aaa').name
50
+ assert_equal :on_color109, Attribute.nearest_rgb_on_color('#aaa', :gray => false).name
31
51
  end
32
- end
33
52
 
53
+ def test_apply
54
+ assert_equal "\e[5m", Attribute[:blink].apply
55
+ assert_equal "\e[5mfoo\e[0m", Attribute[:blink].apply('foo')
56
+ assert_equal "\e[5mfoo\e[0m", Attribute[:blink].apply { 'foo' }
57
+ end
58
+
59
+ def test_gradient
60
+ g0 = Attribute[:blink].gradient_to Attribute['#30ffaa']
61
+ assert_equal [], g0
62
+ g1 = Attribute['#30ffaa'].gradient_to(Attribute['#ff507f'], :steps => 9)
63
+ assert_equal [ :color49, :color49, :color43, :color79, :color108,
64
+ :color247, :color138, :color168, :color204 ], g1.map(&:name)
65
+ g2 = Attribute['#30ffaa'].gradient_to(
66
+ Attribute['#ff507f'],
67
+ :steps => 9,
68
+ :metric => RGBColorMetrics::Euclidean
69
+ )
70
+ assert_equal [ :color49, :color43, :color79, :color73, :color108,
71
+ :color247, :color138, :color168, :color204 ], g2.map(&:name)
72
+ end
73
+ end