handlebars-helpers 0.0.5 → 0.0.73
Sign up to get free protection for your applications and to get access to all the features.
- 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
|