utility_palettes 0.1.1 → 1.0.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: dca0799ec6a022ed4b40a5dd5f6b51c6af59ed96b6a3e1918133baa074ab2091
4
- data.tar.gz: 5f672e9ba3367afce4c67fdf571fd33bb3ceb61953429bd6ec2149b5f7668afd
3
+ metadata.gz: f92d00ec4bd6d39c2ff8c063ee872df11c97e4cd6f35bcef13f3e2384bd5b4e0
4
+ data.tar.gz: bd9a68478305db2c062a1eaa55241ac07f580531199a2f8a2225a6e6c65b68ae
5
5
  SHA512:
6
- metadata.gz: 8af394faa5915bb2a3a5c300522fac1b99e1e5d27e427b7978e4d5a500388c9388914d016d44930e605b02cd807a55df33ef8ea485b3992dba2718f0bcba5601
7
- data.tar.gz: 00eb9d5e344a56c2f6a59632c0108e312cf3e2adc1158c18431600b6c6dbceff5b0527e0696a88051da152aedafd2478f48aeb35d4eea4ff427e5beb25ef6f5c
6
+ metadata.gz: b78ff43e849a7bb275d46ee96bbf26462ca6a1ef62739482168cfb162bca577a4f5a937f3b120d7abaaba1ba7f94a4535f58bb4782c7a9a67d9c59aa5a2b33d0
7
+ data.tar.gz: 94a65dbd6eea0880b16ff285168046a602a1612a1ceb18133098708809cec13d094f0c4f525ed52e54c3545d0cb92a939c566bd203eb887b117bd7ccf754e539
data/README.md CHANGED
@@ -1,123 +1,135 @@
1
- # UtilityPalettes
2
-
3
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/utility_palettes`. To experiment with that code, run `bin/console` for an interactive prompt.
4
-
5
- > Generate your own colour palettes in an instance.
6
-
7
- Utility Palettes is an ruby gem package for use in ruby or other projects that generates palettes and shades based on supplied colours.
8
- Take a single colour and generate a full tailwind-style set of "absolute" shades ranging from -50 to -900 where the given colour is inserted into the range where it suits best.
9
- Or generate "relative" shades that have the supplied colour at it's core and add a -light and -dark shade.
10
-
11
- ## Installation
12
-
13
- Install the gem and add to the application's Gemfile by executing:
14
-
15
- ```bash
16
- bundle add utility_palettes
17
- ```
18
-
19
- If bundler is not being used to manage dependencies, install the gem by executing:
20
-
21
- ```bash
22
- gem install utility_palettes
23
- ```
24
-
25
- ## Usage
26
-
27
- To get the config full of
28
-
29
- ```bash
30
- rails generate utility_palettes:config
31
- ```
32
-
33
- to generate the palettes
34
-
35
- ```bash
36
- rails generate utility_palettes:generate
37
- ```
38
-
39
- ### Environment
40
-
41
- Set the environment that the sub-data will be read in, meaning that the palette generator can only be run in certain environments.
42
-
43
- ### Defaults
44
-
45
- Should the default colours be included for the palette generator. Even if they are included, they can be overwritten by the user's own colour of the same name:
46
-
47
- | Option | Default | Possible Values |
48
- | :--------- | :-----: | :-------------: |
49
- | absolutes | true | true / false |
50
- | relatives | true | true / false |
51
- | singles | true | true / false |
52
-
53
- ### Output
54
-
55
- How the output file and values should be written:
56
-
57
- | Option | Description | Default | Possible Values |
58
- | :------ | :-------------------------------------------------------------------------------------- | :-----: | :-----------------------------------------------------: |
59
- | dated | Should a timestamp be included in the filenames | false | true / false |
60
- | files | The types of files the palette should be output in, written as a comma separated string | json | json, scss, css |
61
- | format | The colour syntax the output colours should be written in | rgb | rgb, hsl, hsv, hsb, cmyk, cielab, lab, cielch, lch, hex |
62
- | prefix | A string that is appended to the start of all colour names, i.e. 'tw-' | '' | <any string> |
63
- | suffix | A string that is appended to the end of all colour names, i.e. '-col' | '' | <any string> |
64
-
65
- The JSON output file will appear at the top-level of your project, while SCSS and CSS are defined to go to `app/assets/stylesheets`.
66
-
67
- ### Method (WIP)
68
-
69
- It allos you to determine how you want the colours to be adjusted to create the variance in your palette, but for now all colour adjustments are made by changing the HSL values as it is the best combination of the simple yet effective and accurate method available.
70
- In the future you will be able to shift the colours by changing values for different colour models and colour spaces; like RGB, CieLAB, OkLCH and others.
71
-
72
- ### Steps (WIP)
73
-
74
- Defines the percentage you want each colour to be adjusted by when moving through the colour palette. For now all steps are for the HSL method of adjusting colours
75
- In the future you will be able to shift the colours by changing values for different colour models and colour spaces; like RGB, CieLAB, OkLCH and others.
76
-
77
- | Option | Description | Default | Possible Values |
78
- | :------ | :----------------------------------: | :-----: | :-------------: |
79
- | h | How much to adjust the hue by | 0 | 0 - 100 |
80
- | s | How much to adjust the saturation by | 2 | 0 - 100 |
81
- | l | How much to adjust the lightness by | 9 | 0 - 100 |
82
-
83
- ### Absolutes
84
-
85
- Here you would define colour names and values that you would like to create an "absolute palette"; where for each colour given, a range of colours are output with -50, -100, ..., -900 suffixes using that colour as the base.
86
-
87
- ### Relatives
88
-
89
- Here you would define colour names and values that you would like to create an "relative palette"; where for each colour given, a -light and -dark colour are generated one step up and down from the base colour.
90
- If a colour is included in both the "absolutes" and "relatives" sections, then the -light and -dark colours will match with colours in the absolute palette.
91
-
92
- ### Singles
93
-
94
- Here you would define colour names and values that you would like copied directly to the output as you have defined them.
95
-
96
- ## Pipeline
97
-
98
- Things that will hopefully be added in future development:
99
-
100
- - Finishing the overall palette spec file
101
- - Migrate off the reliance of Rails Generators
102
- - Different colour model and space methods for adapting colours, and the steps to go with them
103
- - Add more defaults such as different Tailwind version colours
104
- - Have a view that can be copied to apps to allow users the ability to quickly review the colours generated
105
- - Finish the '$' copy functionality to use colours defined in the config for other colours later in the generation process
106
-
107
- ## Development
108
-
109
- After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
110
-
111
- To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
112
-
113
- ## Contributing
114
-
115
- Bug reports and pull requests are welcome on GitHub at <https://github.com/louiswdavis/utility_palettes>. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/louiswdavis/utility_palettes/blob/master/CODE_OF_CONDUCT.md).
116
-
117
- ## License
118
-
119
- The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
120
-
121
- ## Code of Conduct
122
-
123
- Everyone interacting in the UtilityPalettes project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/louiswdavis/utility_palettes/blob/master/CODE_OF_CONDUCT.md).
1
+ # UtilityPalettes
2
+
3
+ > Generate your own colour palettes in an instance.
4
+
5
+ Utility Palettes is an ruby gem package for use in ruby or other projects that generates palettes and shades based on supplied colours.
6
+ Take a single colour and generate a full tailwind-style set of "absolute" shades ranging from -50 to -900 where the given colour is inserted into the range where it suits best.
7
+ Or generate "relative" shades that have the supplied colour at it's core and add a -light and -dark shade.
8
+
9
+ ## Installation
10
+
11
+ Install the gem and add to the application's Gemfile by executing:
12
+
13
+ ```bash
14
+ bundle add utility_palettes
15
+ ```
16
+
17
+ If bundler is not being used to manage dependencies, install the gem by executing:
18
+
19
+ ```bash
20
+ gem install utility_palettes
21
+ ```
22
+
23
+ ## Usage
24
+
25
+ To get the config full of
26
+
27
+ ```bash
28
+ rails generate utility_palettes:config
29
+ ```
30
+
31
+ to generate the palettes
32
+
33
+ ```bash
34
+ rails generate utility_palettes:generate
35
+ ```
36
+
37
+ ## Configuration
38
+
39
+ >[!NOTE]
40
+ > UtilityPalettes has moved to a Ruby Config file so if you used the YML config previously you will need to migrate off that now.
41
+ > Run `rails generate utility_palettes:config` to get the new config and move your values across.
42
+ > Most keys have stayed the same apart from some prepends and the `enable_environments` key which determines what environments code can be run in.
43
+
44
+ ### Environment
45
+
46
+ Set the environment that the sub-data will be read in, meaning that the palette generator can only be run in certain environments.
47
+
48
+ | Option | Default | Value Type | Possible Values |
49
+ | :------------------- | :------------: | :--------: | :--------------------: |
50
+ | enable_environments | [:development] | Array | <any Rails.env symbol> |
51
+
52
+ ### Defaults
53
+
54
+ Should the default colours be included for the palette generator. Even if they are included, they can be overwritten by the user's own colour of the same name:
55
+
56
+ | Option | Default | Value Type | Possible Values |
57
+ | :---------------- | :-----: | :--------: | :-------------: |
58
+ | default_absolutes | true | Boolean | true / false |
59
+ | default_relatives | true | Boolean | true / false |
60
+ | default_singles | true | Boolean | true / false |
61
+
62
+ ### Output
63
+
64
+ How the output file and values should be written:
65
+
66
+ | Option | Description | Default | Value Type | Possible Values |
67
+ | :------------ | :-------------------------------------------------------------------------------------- | :-----: | :--------: | :-----------------------------------------------------: |
68
+ | ouput_dated | Should a timestamp be included in the filenames | false | Boolean | true / false |
69
+ | ouput_files | The types of files the palette should be output in | ['json'] | Array | json, scss, css |
70
+ | ouput_format | The colour syntax the output colours should be written in | hex | String | rgb, hsl, hsv, hsb, cmyk, cielab, lab, cielch, lch, hex |
71
+ | ouput_prefix | A string that is appended to the start of all colour names, i.e. 'tw-' | nil | String | <any string> |
72
+ | ouput_suffix | A string that is appended to the end of all colour names, i.e. '-col' | nil | String | <any string> |
73
+
74
+ The JSON output file will appear at the top-level of your project, while SCSS and CSS are defined to go to `app/assets/stylesheets`.
75
+
76
+ ### Method (WIP)
77
+
78
+ It allows you to determine how you want the colours to be adjusted to create the variance in your palette, but for now all colour adjustments are made by changing the HSL values as it is the best combination of the simple yet effective and accurate method available.
79
+ In the future you will be able to shift the colours by changing values for different colour models and colour spaces; like RGB, CieLAB, OkLCH and others.
80
+
81
+ | Option | Description | Default | Value Type | Possible Values |
82
+ | :------- | :----------------------------------------------- | :-----: | :--------: | :-------------: |
83
+ | method | What colour space to adjust the colour values in | 'hsl' | String | hsl |
84
+
85
+ ### Steps (WIP)
86
+
87
+ Defines the percentage you want each colour to be adjusted by when moving through the colour palette. For now all steps are for the HSL method of adjusting colours
88
+ In the future you will be able to shift the colours by changing values for different colour models and colour spaces; like RGB, CieLAB, OkLCH and others.
89
+
90
+ | Option | Description | Default | Possible Values |
91
+ | :------ | :----------------------------------: | :-----: | :-------------: |
92
+ | steps_h | How much to adjust the hue by | 0 | 0 - 100 |
93
+ | steps_s | How much to adjust the saturation by | 3 | 0 - 100 |
94
+ | steps_l | How much to adjust the lightness by | 8 | 0 - 100 |
95
+
96
+ ### Colours
97
+
98
+ You can define colour names and values that you would like to create an "absolute palette"; where for each colour given, a range of colours are output with -50, -100, ..., -900 suffixes using that colour as the base.
99
+
100
+ You can define colour names and values that you would like to create an "relative palette"; where for each colour given, a -light and -dark colour are generated one step up and down from the base colour.
101
+ If a colour is included in both the "absolutes" and "relatives" sections, then the -light and -dark colours will match with colours in the absolute palette.
102
+
103
+ You can define colour names and values that you would like copied directly to the output as you have defined them.
104
+
105
+ All these options all colours to be passed in the same way; as a hash.
106
+ The key is the base name of the colour.
107
+ The value can be;
108
+
109
+ - a string such as '#ff0000' or 'rgb(51, 102, 204)',
110
+ - a hash of colour space keys and values such as { r: 51, g: 102, b: 204 } or { h: 30, s: 50, l: 75 },
111
+ - a 'reference' to a colour the is previously defined be using that colour name as the value but prepended with '$', such as '$red' (this felt useful if there are colours if you re-use the same colours under different use names)
112
+
113
+ | Option | Default | Possible Values |
114
+ | :-------- | :-----: | :-----------------------------------: |
115
+ | absolutes | {} | { '<colour name>' => <colour value> } |
116
+ | relatives | {} | { '<colour name>' => <colour value> } |
117
+ | singles | {} | { '<colour name>' => <colour value> } |
118
+
119
+ ## Development
120
+
121
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
122
+
123
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org).
124
+
125
+ ## Contributing
126
+
127
+ Bug reports and pull requests are welcome on GitHub at <https://github.com/louiswdavis/utility_palettes>. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [code of conduct](https://github.com/louiswdavis/utility_palettes/blob/master/CODE_OF_CONDUCT.md).
128
+
129
+ ## License
130
+
131
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
132
+
133
+ ## Code of Conduct
134
+
135
+ Everyone interacting in the UtilityPalettes project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/louiswdavis/utility_palettes/blob/master/CODE_OF_CONDUCT.md).
data/Rakefile CHANGED
@@ -1,8 +1,8 @@
1
- # frozen_string_literal: true
2
-
3
- require 'bundler/gem_tasks'
4
- require 'rspec/core/rake_task'
5
-
6
- RSpec::Core::RakeTask.new(:spec)
7
-
8
- task default: :spec
1
+ # frozen_string_literal: true
2
+
3
+ require 'bundler/gem_tasks'
4
+ require 'rspec/core/rake_task'
5
+
6
+ RSpec::Core::RakeTask.new(:spec)
7
+
8
+ task default: :spec
@@ -0,0 +1,54 @@
1
+ # frozen_string_literal: true
2
+
3
+ UtilityPalettes.configure do |config|
4
+ # Enabled Environments
5
+ # config.enable_environments = [:development]
6
+
7
+ # Defaults
8
+ # config.default_absolutes = true
9
+ # config.default_relatives = true
10
+ # config.default_singles = true
11
+
12
+ # Output
13
+ # config.output_dated = false
14
+ # config.output_files = ['json']
15
+ # config.output_format = 'hex'
16
+ # config.output_prefix = nil
17
+ # config.output_suffix = nil
18
+
19
+ # Method
20
+ # config.method = 'hsl'
21
+
22
+ # Steps
23
+ # config.steps_h = 0
24
+ # config.steps_s = 3
25
+ # config.steps_l = 8
26
+
27
+ # Colors - Absolutes
28
+ # config.absolutes = {
29
+ # 'teal' => '#2cb1bc',
30
+ # 'orange' => '#e35f00',
31
+ # 'green' => '#28b840',
32
+ # 'purple' => '#4f3bbf'
33
+ # }
34
+
35
+ # Colors - Relatives
36
+ # config.relatives = {
37
+ # 'success' => '#28b840',
38
+ # 'information' => '#2cb1bc'
39
+ # }
40
+
41
+ # Colors - Singles
42
+ # config.singles = {
43
+ # 'grey-50' => '#fafafa',
44
+ # 'grey-100' => '#f5f5f5',
45
+ # 'grey-200' => '#e5e5e5',
46
+ # 'grey-300' => '#d4d4d4',
47
+ # 'grey-400' => '#a3a3a3',
48
+ # 'grey-500' => '#737373',
49
+ # 'grey-600' => '#525252',
50
+ # 'grey-700' => '#404040',
51
+ # 'grey-800' => '#262626',
52
+ # 'grey-900' => '#171717'
53
+ # }
54
+ end
@@ -1,13 +1,13 @@
1
- # frozen_string_literal: true
2
-
3
- module UtilityPalettes
4
- module Generators
5
- class ConfigGenerator < Rails::Generators::Base
6
- source_root File.expand_path('../../..', __dir__)
7
-
8
- def copy_config
9
- copy_file 'lib/generators/templates/config/utility_palettes.yml', 'config/utility_palettes.yml'
10
- end
11
- end
12
- end
13
- end
1
+ # frozen_string_literal: true
2
+
3
+ module UtilityPalettes
4
+ module Generators
5
+ class ConfigGenerator < Rails::Generators::Base
6
+ source_root File.expand_path('../../..', __dir__)
7
+
8
+ def copy_config
9
+ copy_file 'lib/generators/templates/config/utility_palettes.rb', 'config/initializers/utility_palettes.rb'
10
+ end
11
+ end
12
+ end
13
+ end
@@ -1,35 +1,29 @@
1
- # frozen_string_literal: true
2
-
3
- module UtilityPalettes
4
- module Generators
5
- class GenerateGenerator < Rails::Generators::Base
6
- def generate_utility_palettes
7
- config = {}
8
-
9
- if File.exist?('config/utility_palettes.yml') && defined?(Rails.application.config_for)
10
- config = Rails.application.config_for(:utility_palettes).dig('utility_palettes')
11
- elsif File.exist?('config/utility_palettes.json')
12
- config = JSON.parse(File.read('config/utility_palettes.json')).dig(Rails.env.to_s, 'utility_palettes')
13
- end
14
-
15
- if !config.is_a?(Hash)
16
- self.class.config_format_warn
17
- elsif config.dig('disabled') == true
18
- self.class.disabled_warn
19
- else
20
- UtilityPalettes::Palettes.generate(config)
21
- end
22
- end
23
-
24
- private
25
-
26
- def self.config_format_warn
27
- warn 'ERROR: Utility Palettes config is not formatted as a hash for the "utility_palettes" value'
28
- end
29
-
30
- def self.disabled_warn
31
- warn 'ERROR: Utility Palettes is disabled for this environment'
32
- end
33
- end
34
- end
35
- end
1
+ # frozen_string_literal: true
2
+
3
+ module UtilityPalettes
4
+ module Generators
5
+ class GenerateGenerator < Rails::Generators::Base
6
+ def generate_utility_palettes
7
+ self.class.config_format_warn if File.exist?('config/utility_palettes.yml') || File.exist?('config/utility_palettes.json')
8
+
9
+ if UtilityPalettes.configuration.enable_environments.include?(Rails.env.to_sym)
10
+ UtilityPalettes::Palettes.generate
11
+ else
12
+ self.class.disabled_warn
13
+ end
14
+ end
15
+
16
+ private
17
+
18
+ # TODO: add links to README for migration
19
+ def self.config_format_warn
20
+ warn 'WARNING: Utility Palettes now uses an initializer to set config. You need to migrate and remove your YML/JSON file.'
21
+ end
22
+
23
+ # TODO: add links to README for environment setting
24
+ def self.disabled_warn
25
+ warn 'ERROR: Utility Palettes is disabled for this environment. Palettes will not be generated.'
26
+ end
27
+ end
28
+ end
29
+ end
@@ -1,25 +1,82 @@
1
- # frozen_string_literal: true
2
-
3
- module UtilityPalettes
4
- class Configuration
5
- def self.setup(config)
6
- # default increment steps
7
- default_increments = UtilityPalettes::Configuration.defaults
8
-
9
- user_increments = config.dig(:steps) || {}
10
-
11
- h_step = user_increments.dig(:h) || default_increments.dig('hsl', :h)
12
- s_step = user_increments.dig(:s) || default_increments.dig('hsl', :s)
13
- l_step = user_increments.dig(:l) || default_increments.dig('hsl', :l)
14
-
15
- { h_step: h_step, s_step: s_step, l_step: l_step }
16
- end
17
-
18
- def self.defaults
19
- {
20
- 'rgb' => { r: '7%', g: '7%', b: '7%' },
21
- 'hsl' => { h: 0, s: 2, l: 9 }
22
- }
23
- end
24
- end
25
- end
1
+ # frozen_string_literal: true
2
+
3
+ module UtilityPalettes
4
+ class Configuration
5
+ attr_accessor :enable_environments,
6
+ :use_default_absolutes, :use_default_relatives, :use_default_singles,
7
+ :output_dated, :output_files, :output_format, :output_prefix, :output_suffix,
8
+ :method, :steps_h, :steps_s, :steps_l, :steps_r, :steps_g, :steps_b,
9
+ :absolutes, :relatives, :singles
10
+
11
+ def initialize
12
+ # Enabled Environments
13
+ @enable_environments = [:development]
14
+
15
+ # Defaults
16
+ @use_default_absolutes = true
17
+ @use_default_relatives = true
18
+ @use_default_singles = true
19
+
20
+ # Output
21
+ @output_dated = false
22
+ @output_files = ['json']
23
+ @output_format = 'hex'
24
+ @output_prefix = ''
25
+ @output_suffix = ''
26
+
27
+ # Method
28
+ @method = 'hsl'
29
+
30
+ # Steps
31
+ @steps_h = 0
32
+ @steps_s = 3
33
+ @steps_l = 8
34
+ @steps_r = 9
35
+ @steps_g = 9
36
+ @steps_b = 9
37
+
38
+ # Colors - Absolutes
39
+ @absolutes = {}
40
+
41
+ # Colors - Relatives
42
+ @relatives = {}
43
+
44
+ # Colors - Singles
45
+ @singles = {}
46
+ end
47
+
48
+ def reset!
49
+ self.initialize
50
+ end
51
+
52
+ def validate_settings
53
+ warn "ERROR: The colour sequence method you have submitted to Utility Palettes < #{@method} > is not available" unless @method.to_s.in?(['hsl'])
54
+
55
+ # warn "ERROR: The colour sequence steps you have submitted to Utility Palettes < #{@steps} > have not been formatted as a hash" unless @steps.is_a?(Hash)
56
+
57
+ warn "ERROR: The output files you have submitted to Utility Palettes < #{@output_files} > have not been formatted as an array" unless @absolutes.is_a?(Array)
58
+
59
+ warn "ERROR: The absolute swatches you have submitted to Utility Palettes < #{@absolutes} > have not been formatted as a hash" unless @absolutes.is_a?(Hash)
60
+ warn "ERROR: The relative swatches you have submitted to Utility Palettes < #{@relatives} > have not been formatted as a hash" unless @relatives.is_a?(Hash)
61
+ warn "ERROR: The single swatches you have submitted to Utility Palettes < #{@singles} > have not been formatted as a hash" unless @singles.is_a?(Hash)
62
+
63
+ [@method.to_s.in?(['hsl']), @absolutes.is_a?(Hash), @relatives.is_a?(Hash), @singles.is_a?(Hash)].all?
64
+ end
65
+ end
66
+
67
+ class << self
68
+ attr_writer :configuration
69
+
70
+ def configuration
71
+ @configuration ||= Configuration.new
72
+ end
73
+
74
+ def configure
75
+ yield(configuration)
76
+ end
77
+
78
+ def reset_configuration!
79
+ @configuration = Configuration.new
80
+ end
81
+ end
82
+ end