handlebars-helpers 0.0.5 → 0.0.73
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 +4 -4
- data/.github/workflows/ruby.yml +2 -3
- data/.gitignore +1 -0
- data/.handlebars_helpers.json +956 -0
- data/.handlebars_string_formatters.json +137 -0
- data/.rubocop.yml +4 -2
- data/.vscode/settings.json +6 -0
- data/Gemfile +3 -0
- data/README.md +31 -3
- data/Rakefile +1 -0
- data/STORIES.md +55 -7
- data/USAGE.md +1 -1
- data/bin/console +1 -1
- data/handlebars-helpers.gemspec +10 -1
- data/lib/handlebars/helpers.rb +2 -0
- data/lib/handlebars/helpers/base_helper.rb +36 -0
- data/lib/handlebars/helpers/base_safe_string_helper.rb +17 -0
- data/lib/handlebars/helpers/code_ruby/classify.rb +40 -0
- data/lib/handlebars/helpers/code_ruby/deconstantize.rb +48 -0
- data/lib/handlebars/helpers/code_ruby/demodulize.rb +58 -0
- data/lib/handlebars/helpers/code_ruby/foreign_key.rb +49 -0
- data/lib/handlebars/helpers/code_ruby/tableize.rb +35 -0
- data/lib/handlebars/helpers/comparison/and.rb +44 -0
- data/lib/handlebars/helpers/comparison/default.rb +66 -0
- data/lib/handlebars/helpers/comparison/eq.rb +35 -0
- data/lib/handlebars/helpers/comparison/gt.rb +35 -0
- data/lib/handlebars/helpers/comparison/gte.rb +43 -0
- data/lib/handlebars/helpers/comparison/lt.rb +35 -0
- data/lib/handlebars/helpers/comparison/lte.rb +43 -0
- data/lib/handlebars/helpers/comparison/ne.rb +35 -0
- data/lib/handlebars/helpers/comparison/or.rb +56 -0
- data/lib/handlebars/helpers/configuration.rb +72 -0
- data/lib/handlebars/helpers/inflection/ordinal.rb +58 -0
- data/lib/handlebars/helpers/inflection/ordinalize.rb +59 -0
- data/lib/handlebars/helpers/inflection/pluralize.rb +36 -0
- data/lib/handlebars/helpers/inflection/pluralize_by_number.rb +60 -0
- data/lib/handlebars/helpers/inflection/singularize.rb +35 -0
- data/lib/handlebars/helpers/misc/noop.rb +36 -0
- data/lib/handlebars/helpers/misc/safe.rb +37 -0
- data/lib/handlebars/helpers/register_helpers.rb +73 -0
- data/lib/handlebars/helpers/string_formatting/append_if.rb +42 -0
- data/lib/handlebars/helpers/string_formatting/back_slash.rb +33 -0
- data/lib/handlebars/helpers/string_formatting/camel.rb +29 -0
- data/lib/handlebars/helpers/string_formatting/constantize.rb +29 -0
- data/lib/handlebars/helpers/string_formatting/dasherize.rb +33 -0
- data/lib/handlebars/helpers/string_formatting/dotirize.rb +33 -0
- data/lib/handlebars/helpers/string_formatting/double_colon.rb +33 -0
- data/lib/handlebars/helpers/string_formatting/downcase.rb +31 -0
- data/lib/handlebars/helpers/string_formatting/format_as.rb +57 -0
- data/lib/handlebars/helpers/string_formatting/humanize.rb +39 -0
- data/lib/handlebars/helpers/string_formatting/lamel.rb +29 -0
- data/lib/handlebars/helpers/string_formatting/padl.rb +58 -0
- data/lib/handlebars/helpers/string_formatting/padr.rb +59 -0
- data/lib/handlebars/helpers/string_formatting/pluserize.rb +29 -0
- data/lib/handlebars/helpers/string_formatting/prepend_if.rb +42 -0
- data/lib/handlebars/helpers/string_formatting/singularize.rb +35 -0
- data/lib/handlebars/helpers/string_formatting/slash.rb +33 -0
- data/lib/handlebars/helpers/string_formatting/snake.rb +33 -0
- data/lib/handlebars/helpers/string_formatting/string.js +511 -0
- data/lib/handlebars/helpers/string_formatting/surround.rb +49 -0
- data/lib/handlebars/helpers/string_formatting/surround_if.rb +43 -0
- data/lib/handlebars/helpers/string_formatting/titleize.rb +39 -0
- data/lib/handlebars/helpers/string_formatting/upcase.rb +31 -0
- data/lib/handlebars/helpers/string_tokenizer.rb +43 -0
- data/lib/handlebars/helpers/template.rb +68 -0
- data/lib/handlebars/helpers/version.rb +1 -1
- metadata +97 -6
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# reference: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb
|
4
|
+
require 'active_support/core_ext/string'
|
5
|
+
|
6
|
+
require 'handlebars/helpers/base_helper'
|
7
|
+
|
8
|
+
module Handlebars
|
9
|
+
module Helpers
|
10
|
+
# Comparison helpers, eg. or, and, equal, not equal, less than, greater than etc.
|
11
|
+
module Comparison
|
12
|
+
# Lte: (less than or equal to) Block helper that renders a block if `a` is **less than or equal to** `b`. If an inverse block is specified it will be rendered when falsy.
|
13
|
+
class Lte < Handlebars::Helpers::BaseHelper
|
14
|
+
# Parse will Lte: (less than or equal to) Block helper that renders a block if `a` is **less than or equal to** `b`. If an inverse block is specified it will be rendered when falsy.
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
#
|
18
|
+
# puts Lte.new.parse(1, 2)
|
19
|
+
#
|
20
|
+
# Truthy
|
21
|
+
#
|
22
|
+
# puts Lte.new.parse(1, 1)
|
23
|
+
#
|
24
|
+
# Truthy
|
25
|
+
#
|
26
|
+
# puts Lte.new.parse(2, 1)
|
27
|
+
#
|
28
|
+
# Falsey
|
29
|
+
#
|
30
|
+
# @param [String] lhs - left hand side value
|
31
|
+
# @param [String] rhs - right hand side value
|
32
|
+
# @return [String] truthy value if left hand side LESS THAN or EQUAL to right hand side
|
33
|
+
def parse(lhs, rhs)
|
34
|
+
lhs <= rhs
|
35
|
+
end
|
36
|
+
|
37
|
+
def handlebars_helper
|
38
|
+
proc { |_context, lhs, rhs| wrapper(parse(lhs, rhs)) }
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# reference: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb
|
4
|
+
require 'active_support/core_ext/string'
|
5
|
+
|
6
|
+
require 'handlebars/helpers/base_helper'
|
7
|
+
|
8
|
+
module Handlebars
|
9
|
+
module Helpers
|
10
|
+
# Comparison helpers, eg. or, and, equal, not equal, less than, greater than etc.
|
11
|
+
module Comparison
|
12
|
+
# Ne: (not equal) Block helper that renders a block if `a` is **not equal to** `b`. If an inverse block is specified it will be rendered when falsy.
|
13
|
+
class Ne < Handlebars::Helpers::BaseHelper
|
14
|
+
# Parse will Ne: (not equal) Block helper that renders a block if `a` is **not equal to** `b`. If an inverse block is specified it will be rendered when falsy.
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
#
|
18
|
+
# puts Ne.new.parse('aaa', 'bbb')
|
19
|
+
#
|
20
|
+
# Truthy
|
21
|
+
#
|
22
|
+
# @param [String] lhs - left hand side value
|
23
|
+
# @param [String] rhs - right hand side value
|
24
|
+
# @return [String] truthy value if left hand side is NOT equal to right hand side
|
25
|
+
def parse(lhs, rhs)
|
26
|
+
lhs != rhs
|
27
|
+
end
|
28
|
+
|
29
|
+
def handlebars_helper
|
30
|
+
proc { |_context, lhs, rhs| wrapper(parse(lhs, rhs)) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,56 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# reference: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb
|
4
|
+
require 'active_support/core_ext/string'
|
5
|
+
|
6
|
+
require 'handlebars/helpers/base_helper'
|
7
|
+
|
8
|
+
module Handlebars
|
9
|
+
module Helpers
|
10
|
+
# Comparison helpers, eg. or, and, equal, not equal, less than, greater than etc.
|
11
|
+
module Comparison
|
12
|
+
# Or: Block helper that renders a block if **any of** the given values is truthy. If an inverse block is specified it will be rendered when falsy.
|
13
|
+
#
|
14
|
+
# @example
|
15
|
+
#
|
16
|
+
# {{#if (or p1 p2 p3 p4 p5)}}
|
17
|
+
# found
|
18
|
+
# {{/if}}
|
19
|
+
#
|
20
|
+
# @example
|
21
|
+
#
|
22
|
+
# {{#if (or
|
23
|
+
# (eq section1 "foo")
|
24
|
+
# (ne section2 "bar"))}}
|
25
|
+
# .. content
|
26
|
+
# {{/if}}
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
# {{#if (or name age)}}
|
30
|
+
# {{name}}-{{age}}
|
31
|
+
# {{else}}
|
32
|
+
# no name or age
|
33
|
+
# {{/if}}
|
34
|
+
class Or < Handlebars::Helpers::BaseHelper
|
35
|
+
# Parse will Or: Block helper that renders a block if **any of** the given values is truthy. If an inverse block is specified it will be rendered when falsy.
|
36
|
+
#
|
37
|
+
# @example
|
38
|
+
#
|
39
|
+
# puts Or.new.parse(var1, var2)
|
40
|
+
#
|
41
|
+
# truthy block
|
42
|
+
#
|
43
|
+
# @param values list of values (via *splat) to be checked via OR condition
|
44
|
+
# @return [String] return block when first value is truthy
|
45
|
+
def parse(values)
|
46
|
+
values.any? { |value| value }
|
47
|
+
end
|
48
|
+
|
49
|
+
def handlebars_helper
|
50
|
+
# Exclude last paramater which is the context V8::Object
|
51
|
+
proc { |_context, *values| wrapper(parse(values[0..-2])) }
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
@@ -0,0 +1,72 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'handlebars/helpers/string_tokenizer'
|
4
|
+
|
5
|
+
module Handlebars
|
6
|
+
# Configuration access for Handlebars/Helpers
|
7
|
+
module Helpers
|
8
|
+
# Configuration access for handlebars/helpers
|
9
|
+
class << self
|
10
|
+
attr_writer :configuration
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.configuration
|
14
|
+
@configuration ||= Configuration.new
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.reset
|
18
|
+
@configuration = Configuration.new
|
19
|
+
end
|
20
|
+
|
21
|
+
def self.configure
|
22
|
+
yield(configuration)
|
23
|
+
end
|
24
|
+
|
25
|
+
# Configuration class
|
26
|
+
class Configuration
|
27
|
+
attr_accessor :tokenizer,
|
28
|
+
:helper_config_file,
|
29
|
+
:padl_count,
|
30
|
+
:padl_char,
|
31
|
+
:padr_count,
|
32
|
+
:padr_char
|
33
|
+
attr_reader :string_formatter_config_file
|
34
|
+
attr_writer :string_formatter_config
|
35
|
+
|
36
|
+
def initialize
|
37
|
+
@tokenizer = Handlebars::Helpers::StringTokenizer.new
|
38
|
+
@helper_config_file = '.handlebars_helpers.json'
|
39
|
+
@string_formatter_config_file = '.handlebars_string_formatters.json'
|
40
|
+
@padr_count = 30
|
41
|
+
@padr_char = ' '
|
42
|
+
@padl_count = 30
|
43
|
+
@padl_char = ' '
|
44
|
+
end
|
45
|
+
|
46
|
+
def string_formatter_config_file=(value)
|
47
|
+
@string_formatter_config_file = value
|
48
|
+
# updating the file will clear the config object,
|
49
|
+
# which will be reloaded on next call to string_formatter_config
|
50
|
+
self.string_formatter_config = nil
|
51
|
+
end
|
52
|
+
|
53
|
+
def string_formatter_config
|
54
|
+
@string_formatter_config ||= build_string_formatter_config
|
55
|
+
end
|
56
|
+
|
57
|
+
def build_string_formatter_config
|
58
|
+
config_content = File.read(string_formatter_config_file)
|
59
|
+
config = JSON.parse(config_content)
|
60
|
+
configured_formatters = config['formatters']
|
61
|
+
configured_formatters.each_with_object({}) do |formatter, result|
|
62
|
+
require formatter['require_path']
|
63
|
+
helper_instance = Object.const_get(formatter['class_namespace']).new
|
64
|
+
|
65
|
+
formatter['aliases'].each do |name|
|
66
|
+
result[name.to_sym] = helper_instance
|
67
|
+
end
|
68
|
+
end
|
69
|
+
end
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# reference: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb
|
4
|
+
require 'active_support/core_ext/integer/inflections'
|
5
|
+
|
6
|
+
require 'handlebars/helpers/base_helper'
|
7
|
+
|
8
|
+
module Handlebars
|
9
|
+
module Helpers
|
10
|
+
# Inflection handling routines, eg. pluralize, singular, ordinalize
|
11
|
+
module Inflection
|
12
|
+
# Ordinal: The suffix that should be added to a number to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th
|
13
|
+
class Ordinal < Handlebars::Helpers::BaseHelper
|
14
|
+
# Parse will Ordinal: The suffix that should be added to a number to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
#
|
18
|
+
# puts Ordinal.new.parse('1')
|
19
|
+
#
|
20
|
+
# st
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
#
|
24
|
+
# puts Ordinal.new.parse('2')
|
25
|
+
#
|
26
|
+
# nd
|
27
|
+
#
|
28
|
+
# @example
|
29
|
+
#
|
30
|
+
# puts Ordinal.new.parse('3')
|
31
|
+
#
|
32
|
+
# rd
|
33
|
+
#
|
34
|
+
# @example
|
35
|
+
#
|
36
|
+
# puts Ordinal.new.parse('4')
|
37
|
+
#
|
38
|
+
# th
|
39
|
+
#
|
40
|
+
# @param [String] value - numeric value
|
41
|
+
# @return [String] ordinal suffix that would be required for a number
|
42
|
+
def parse(value)
|
43
|
+
return '' if value.nil?
|
44
|
+
|
45
|
+
value = value.to_i if value.is_a? String
|
46
|
+
|
47
|
+
value.ordinal
|
48
|
+
end
|
49
|
+
|
50
|
+
def handlebars_helper
|
51
|
+
proc do |_context, value|
|
52
|
+
wrapper(parse(value))
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,59 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# reference: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb
|
4
|
+
# require 'active_support/inflector/inflections'
|
5
|
+
require 'active_support/core_ext/integer/inflections'
|
6
|
+
|
7
|
+
require 'handlebars/helpers/base_helper'
|
8
|
+
|
9
|
+
module Handlebars
|
10
|
+
module Helpers
|
11
|
+
# Inflection handling routines, eg. pluralize, singular, ordinalize
|
12
|
+
module Inflection
|
13
|
+
# Ordinalize: Turns a number into an ordinal string used to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
|
14
|
+
class Ordinalize < Handlebars::Helpers::BaseHelper
|
15
|
+
# Parse will Ordinalize: Turns a number into an ordinal string used to denote the position in an ordered sequence such as 1st, 2nd, 3rd, 4th.
|
16
|
+
#
|
17
|
+
# @example
|
18
|
+
#
|
19
|
+
# puts Ordinalize.new.parse('1')
|
20
|
+
#
|
21
|
+
# 1st
|
22
|
+
#
|
23
|
+
# @example
|
24
|
+
#
|
25
|
+
# puts Ordinalize.new.parse('2')
|
26
|
+
#
|
27
|
+
# 2nd
|
28
|
+
#
|
29
|
+
# @example
|
30
|
+
#
|
31
|
+
# puts Ordinalize.new.parse('3')
|
32
|
+
#
|
33
|
+
# 3rd
|
34
|
+
#
|
35
|
+
# @example
|
36
|
+
#
|
37
|
+
# puts Ordinalize.new.parse('4')
|
38
|
+
#
|
39
|
+
# 4th
|
40
|
+
#
|
41
|
+
# @param [String] value - numeric value
|
42
|
+
# @return [String] number value turned to 1st, 2nd, 3rd, 4th etc.
|
43
|
+
def parse(value)
|
44
|
+
return '' if value.nil?
|
45
|
+
|
46
|
+
value = value.to_i if value.is_a? String
|
47
|
+
|
48
|
+
value.ordinalize
|
49
|
+
end
|
50
|
+
|
51
|
+
def handlebars_helper
|
52
|
+
proc do |_context, value|
|
53
|
+
wrapper(parse(value))
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# reference: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb
|
4
|
+
require 'active_support/core_ext/string'
|
5
|
+
|
6
|
+
require 'handlebars/helpers/base_helper'
|
7
|
+
|
8
|
+
module Handlebars
|
9
|
+
module Helpers
|
10
|
+
# Inflection handling routines, eg. pluralize, singular, ordinalize
|
11
|
+
module Inflection
|
12
|
+
# Returns the plural form of the word in the string
|
13
|
+
class Pluralize < Handlebars::Helpers::BaseHelper
|
14
|
+
# Parse will Returns the plural form of the word in the string
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
#
|
18
|
+
# puts Pluralize.new.parse('name')
|
19
|
+
#
|
20
|
+
# names
|
21
|
+
#
|
22
|
+
# puts Pluralize.new.parse('octopus')
|
23
|
+
#
|
24
|
+
# octopi
|
25
|
+
#
|
26
|
+
#
|
27
|
+
# @return [String] value in plural form
|
28
|
+
def parse(value)
|
29
|
+
return '' if value.nil?
|
30
|
+
|
31
|
+
value.pluralize
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,60 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# reference: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb
|
4
|
+
require 'active_support/core_ext/string'
|
5
|
+
|
6
|
+
require 'handlebars/helpers/base_helper'
|
7
|
+
|
8
|
+
module Handlebars
|
9
|
+
module Helpers
|
10
|
+
# Inflection handling routines, eg. pluralize, singular, ordinalize
|
11
|
+
module Inflection
|
12
|
+
# Pluralize By Number: uses both a word and number to decide if the plural or singular form should be used.
|
13
|
+
class PluralizeByNumber < Handlebars::Helpers::BaseHelper
|
14
|
+
# Parse will Pluralize By Number: uses both a word and number to decide if the plural or singular form should be used.
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
#
|
18
|
+
# puts PluralizeByNumber.new.parse('category', '3', 'number_word')
|
19
|
+
#
|
20
|
+
# 3 categories
|
21
|
+
#
|
22
|
+
# @example
|
23
|
+
#
|
24
|
+
# puts PluralizeByNumber.new.parse('category', '3', 'word' )
|
25
|
+
#
|
26
|
+
# categories
|
27
|
+
#
|
28
|
+
# puts PluralizeByNumber.new.parse('category', '1' )
|
29
|
+
#
|
30
|
+
# category
|
31
|
+
#
|
32
|
+
# @param [String] value - value to pluralize
|
33
|
+
# @param [Integer] count - count used to determine pluralization
|
34
|
+
# @param [String] format - (Optional) what format should output be. :word, :number_word
|
35
|
+
# @return [String] value and number are used to calculate plural/singular form
|
36
|
+
def parse(value, count, format)
|
37
|
+
return '' if value.nil?
|
38
|
+
|
39
|
+
count = count.to_i if count.is_a? String
|
40
|
+
format = :word if format.nil?
|
41
|
+
|
42
|
+
case format.to_sym
|
43
|
+
when :number_word, :number_and_word
|
44
|
+
"#{count} #{value.pluralize(count)}"
|
45
|
+
else # aka :word
|
46
|
+
value.pluralize(count)
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
def handlebars_helper
|
51
|
+
proc do |_context, value, count, format|
|
52
|
+
# Handle optional: format
|
53
|
+
format = nil if value.is_a?(V8::Object)
|
54
|
+
wrapper(parse(value, count, format))
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# reference: https://github.com/rails/rails/blob/master/activesupport/lib/active_support/inflector/methods.rb
|
4
|
+
require 'active_support/core_ext/string'
|
5
|
+
|
6
|
+
require 'handlebars/helpers/base_helper'
|
7
|
+
|
8
|
+
module Handlebars
|
9
|
+
module Helpers
|
10
|
+
# Inflection handling routines, eg. pluralize, singular, ordinalize
|
11
|
+
module Inflection
|
12
|
+
# The reverse of #pluralize, returns the singular form of a word in a string
|
13
|
+
class Singularize < Handlebars::Helpers::BaseHelper
|
14
|
+
# Parse will reverse of #pluralize, returns the singular form of a word in a string
|
15
|
+
#
|
16
|
+
# @example
|
17
|
+
#
|
18
|
+
# puts Singularize.new.parse('names')
|
19
|
+
#
|
20
|
+
# name
|
21
|
+
#
|
22
|
+
# puts Singularize.new.parse('octopi')
|
23
|
+
#
|
24
|
+
# octopus
|
25
|
+
#
|
26
|
+
# @return [String] plural value turned to singular value
|
27
|
+
def parse(value)
|
28
|
+
return '' if value.nil?
|
29
|
+
|
30
|
+
value.singularize
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|