bcome 1.3.6 → 1.4.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 +4 -4
- data/bin/bcome +13 -8
- data/lib/bcome.rb +7 -11
- data/lib/objects/bcome/version.rb +19 -1
- data/lib/objects/bootup.rb +13 -5
- data/lib/objects/command/local.rb +2 -0
- data/lib/objects/config_factory.rb +3 -0
- data/lib/objects/driver/base.rb +36 -4
- data/lib/objects/driver/bucket.rb +6 -4
- data/lib/objects/driver/ec2.rb +35 -4
- data/lib/objects/driver/gcp.rb +124 -0
- data/lib/objects/driver/gcp/authentication/api_key.rb +6 -0
- data/lib/objects/driver/gcp/authentication/oauth.rb +101 -0
- data/lib/objects/driver/gcp/authentication/service_account.rb +7 -0
- data/lib/objects/driver/static.rb +2 -0
- data/lib/objects/encryptor.rb +26 -24
- data/lib/objects/exception/argument_error_invoking_method_from_command_line.rb +8 -4
- data/lib/objects/exception/base.rb +14 -10
- data/lib/objects/exception/can_only_subselect_on_inventory.rb +8 -4
- data/lib/objects/exception/cannot_authenticate_to_gcp.rb +11 -0
- data/lib/objects/exception/cannot_find_internal_registry_klass.rb +8 -4
- data/lib/objects/exception/cannot_find_inventory.rb +11 -0
- data/lib/objects/exception/cannot_find_subselection_parent.rb +8 -4
- data/lib/objects/exception/cant_find_key_in_cloud_tags.rb +8 -4
- data/lib/objects/exception/cant_find_key_in_metadata.rb +8 -4
- data/lib/objects/exception/cant_find_proxy_host_by_identifier.rb +8 -4
- data/lib/objects/exception/cant_find_proxy_host_by_namespace.rb +8 -4
- data/lib/objects/exception/could_not_initiate_ssh_connection.rb +8 -4
- data/lib/objects/exception/could_not_initiate_ssh_connection_through_backend_proxy.rb +8 -4
- data/lib/objects/exception/could_not_retrieve_terraform_output.rb +11 -0
- data/lib/objects/exception/deprecation_warning.rb +9 -7
- data/lib/objects/exception/duplicate_command_line_argument_key.rb +8 -4
- data/lib/objects/exception/ec2_driver_missing_provisioning_region.rb +8 -4
- data/lib/objects/exception/failed_to_run_local_command.rb +8 -4
- data/lib/objects/exception/generic.rb +11 -0
- data/lib/objects/exception/interactive_session_halt.rb +6 -2
- data/lib/objects/exception/invalid_bcome_breadcrumb.rb +8 -4
- data/lib/objects/exception/invalid_breadcrumb.rb +8 -4
- data/lib/objects/exception/invalid_context_command.rb +8 -4
- data/lib/objects/exception/invalid_gcp_authentication_scheme.rb +11 -0
- data/lib/objects/exception/invalid_identifier.rb +8 -4
- data/lib/objects/exception/invalid_machines_cache_config.rb +8 -4
- data/lib/objects/exception/invalid_matcher_query.rb +8 -4
- data/lib/objects/exception/invalid_meta_data_config.rb +8 -4
- data/lib/objects/exception/invalid_metadata_encryption_key.rb +8 -4
- data/lib/objects/exception/invalid_network_config.rb +8 -4
- data/lib/objects/exception/invalid_network_driver_type.rb +8 -4
- data/lib/objects/exception/invalid_port_forward_request.rb +11 -0
- data/lib/objects/exception/invalid_proxy_config.rb +8 -4
- data/lib/objects/exception/invalid_regexp_matcher_in_registry.rb +8 -4
- data/lib/objects/exception/invalid_registry_arguments_type.rb +8 -4
- data/lib/objects/exception/invalid_registry_command_name_length.rb +8 -4
- data/lib/objects/exception/invalid_registry_data_config.rb +8 -4
- data/lib/objects/exception/invalid_restriction_key_in_registry.rb +8 -4
- data/lib/objects/exception/invalid_ssh_config.rb +8 -4
- data/lib/objects/exception/inventories_cannot_have_subviews.rb +8 -4
- data/lib/objects/exception/malformed_command_line_arguments.rb +8 -4
- data/lib/objects/exception/method_invocation_requires_parameter.rb +8 -4
- data/lib/objects/exception/method_name_conflict_in_registry.rb +8 -4
- data/lib/objects/exception/missing_argument_for_registry_command.rb +8 -4
- data/lib/objects/exception/missing_description_on_view.rb +8 -4
- data/lib/objects/exception/missing_execute_on_registry_object.rb +8 -4
- data/lib/objects/exception/missing_gcp_authentication_scheme.rb +11 -0
- data/lib/objects/exception/missing_gcp_service_scopes.rb +11 -0
- data/lib/objects/exception/missing_identifier_on_view.rb +8 -4
- data/lib/objects/exception/missing_inventory_contributors.rb +11 -0
- data/lib/objects/exception/missing_ip_address_on_server.rb +8 -4
- data/lib/objects/exception/missing_network_config.rb +8 -4
- data/lib/objects/exception/missing_or_invalid_client_secrets.rb +11 -0
- data/lib/objects/exception/missing_params_for_rsync.rb +8 -4
- data/lib/objects/exception/missing_params_for_scp.rb +8 -4
- data/lib/objects/exception/missing_subselection_key.rb +8 -4
- data/lib/objects/exception/missing_type_on_view.rb +8 -4
- data/lib/objects/exception/no_node_found_for_breadcrumb.rb +8 -4
- data/lib/objects/exception/no_node_named_by_identifier.rb +8 -4
- data/lib/objects/exception/node_identifiers_must_be_unique.rb +8 -4
- data/lib/objects/exception/orchestration_script_does_not_exist.rb +8 -4
- data/lib/objects/exception/proxy_host_node_does_not_have_public_ip_address.rb +8 -4
- data/lib/objects/exception/unknown_dynamic_server_type.rb +11 -0
- data/lib/objects/exception/unknown_method_for_namespace.rb +8 -4
- data/lib/objects/interactive/session.rb +4 -1
- data/lib/objects/interactive/session_item/base.rb +2 -0
- data/lib/objects/interactive/session_item/capture_input.rb +2 -0
- data/lib/objects/interactive/session_item/transparent_ssh.rb +29 -23
- data/lib/objects/loading_bar/handler.rb +80 -0
- data/lib/objects/loading_bar/indicator/base.rb +64 -0
- data/lib/objects/loading_bar/indicator/basic.rb +34 -0
- data/lib/objects/loading_bar/indicator/progress.rb +26 -0
- data/lib/objects/loading_bar/pid_bucket.rb +27 -0
- data/lib/objects/modules/context.rb +13 -9
- data/lib/objects/modules/registry_management.rb +16 -10
- data/lib/objects/modules/ui_output.rb +10 -6
- data/lib/objects/modules/workspace_commands.rb +159 -155
- data/lib/objects/modules/workspace_menu.rb +129 -130
- data/lib/objects/node/attributes.rb +13 -21
- data/lib/objects/node/base.rb +113 -71
- data/lib/objects/node/cache_handler.rb +2 -0
- data/lib/objects/node/collection.rb +10 -9
- data/lib/objects/node/factory.rb +35 -28
- data/lib/objects/node/inventory/base.rb +100 -100
- data/lib/objects/node/inventory/defined.rb +110 -89
- data/lib/objects/node/inventory/merge.rb +43 -0
- data/lib/objects/node/inventory/subselect.rb +64 -46
- data/lib/objects/node/kube/base.rb +51 -0
- data/lib/objects/node/kube/container.rb +9 -0
- data/lib/objects/node/kube/estate.rb +19 -0
- data/lib/objects/node/kube/namespace.rb +24 -0
- data/lib/objects/node/kube/pod.rb +24 -0
- data/lib/objects/node/kube_wrap.rb +26 -0
- data/lib/objects/node/meta/base.rb +8 -1
- data/lib/objects/node/meta/cloud.rb +2 -0
- data/lib/objects/node/meta/local.rb +2 -0
- data/lib/objects/node/meta_data_factory.rb +3 -1
- data/lib/objects/node/meta_data_loader.rb +27 -28
- data/lib/objects/node/resources/base.rb +5 -1
- data/lib/objects/node/resources/inventory.rb +7 -5
- data/lib/objects/node/resources/merged.rb +38 -0
- data/lib/objects/node/resources/sub_inventory.rb +7 -4
- data/lib/objects/node/server/base.rb +88 -66
- data/lib/objects/node/server/dynamic/base.rb +23 -0
- data/lib/objects/node/server/{dynamic.rb → dynamic/ec2.rb} +14 -13
- data/lib/objects/node/server/dynamic/gcp.rb +47 -0
- data/lib/objects/node/server/static.rb +13 -2
- data/lib/objects/orchestration/base.rb +10 -0
- data/lib/objects/orchestration/interactive_terraform.rb +62 -27
- data/lib/objects/orchestrator.rb +22 -0
- data/lib/objects/parser/bread_crumb.rb +3 -1
- data/lib/objects/registry/arguments/base.rb +3 -1
- data/lib/objects/registry/arguments/command_line.rb +6 -1
- data/lib/objects/registry/arguments/console.rb +4 -1
- data/lib/objects/registry/command/base.rb +3 -0
- data/lib/objects/registry/command/external.rb +4 -2
- data/lib/objects/registry/command/group.rb +6 -3
- data/lib/objects/registry/command/internal.rb +3 -1
- data/lib/objects/registry/command/shortcut.rb +17 -9
- data/lib/objects/registry/command_list.rb +2 -0
- data/lib/objects/registry/loader.rb +10 -10
- data/lib/objects/ssh/bootstrap.rb +3 -1
- data/lib/objects/ssh/command.rb +10 -5
- data/lib/objects/ssh/command_exec.rb +13 -9
- data/lib/objects/ssh/connection_wrangler.rb +105 -0
- data/lib/objects/ssh/connector.rb +100 -0
- data/lib/objects/ssh/driver.rb +27 -230
- data/lib/objects/ssh/driver_concerns/command_strings.rb +17 -0
- data/lib/objects/ssh/driver_concerns/connection.rb +78 -0
- data/lib/objects/ssh/driver_concerns/functions.rb +89 -0
- data/lib/objects/ssh/driver_concerns/user.rb +32 -0
- data/lib/objects/ssh/{proxy_data.rb → proxy_hop.rb} +52 -7
- data/lib/objects/ssh/script_exec.rb +4 -1
- data/lib/objects/ssh/tunnel/local_port_forward.rb +5 -6
- data/lib/objects/ssh/tunnel_keeper.rb +21 -0
- data/lib/objects/ssh/window.rb +31 -0
- data/lib/objects/startup.rb +52 -0
- data/lib/objects/system/local.rb +3 -0
- data/lib/objects/terraform/output.rb +41 -0
- data/lib/objects/workspace.rb +3 -14
- data/patches/irb.rb +27 -3
- data/patches/string-encrypt.rb +20 -23
- data/patches/string.rb +5 -1
- data/patches/string_stylesheet.rb +2 -0
- metadata +95 -18
- data/lib/objects/progress_bar.rb +0 -30
- data/lib/objects/ssh/connection_handler.rb +0 -101
- data/lib/objects/terraform/parser.rb +0 -23
- data/lib/objects/terraform/state.rb +0 -40
data/lib/objects/encryptor.rb
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Bcome
|
2
4
|
class Encryptor
|
3
|
-
|
4
|
-
|
5
|
-
ENC_SIGNIFIER = "enc".freeze
|
5
|
+
UNENC_SIGNIFIER = ''
|
6
|
+
ENC_SIGNIFIER = 'enc'
|
6
7
|
|
7
8
|
include Singleton
|
8
9
|
|
@@ -19,11 +20,12 @@ module Bcome
|
|
19
20
|
else
|
20
21
|
puts "\nNo unencrypted files to encrypt.\n".warning
|
21
22
|
end
|
22
|
-
|
23
|
+
nil
|
23
24
|
end
|
24
25
|
|
25
26
|
def prompt_for_key
|
26
|
-
|
27
|
+
puts "\n"
|
28
|
+
print 'Please enter an encryption key (and if your data is already encrypted, you must provide the same key): '.informational
|
27
29
|
@key = STDIN.noecho(&:gets).chomp
|
28
30
|
puts "\n"
|
29
31
|
end
|
@@ -46,25 +48,26 @@ module Bcome
|
|
46
48
|
|
47
49
|
def unpack
|
48
50
|
prompt_for_key
|
49
|
-
toggle_packed_files(all_encrypted_filenames
|
50
|
-
|
51
|
+
toggle_packed_files(all_encrypted_filenames, :decrypt)
|
52
|
+
nil
|
51
53
|
end
|
52
54
|
|
53
55
|
def toggle_packed_files(filenames, packer_method)
|
54
|
-
raise
|
56
|
+
raise 'Missing encryption key. Please set an encryption key' unless @key
|
57
|
+
|
55
58
|
filenames.each do |filename|
|
56
59
|
# Get raw
|
57
60
|
raw_contents = File.read(filename)
|
58
|
-
|
61
|
+
|
59
62
|
if packer_method == :decrypt
|
60
|
-
filename =~
|
61
|
-
opposing_filename =
|
62
|
-
action =
|
63
|
+
filename =~ %r{#{path_to_metadata}/(.+)\.enc}
|
64
|
+
opposing_filename = Regexp.last_match(1)
|
65
|
+
action = 'Unpacking'
|
63
66
|
else
|
64
|
-
filename =~
|
65
|
-
opposing_filename = "#{
|
66
|
-
action =
|
67
|
-
end
|
67
|
+
filename =~ %r{#{path_to_metadata}/(.*)}
|
68
|
+
opposing_filename = "#{Regexp.last_match(1)}.enc"
|
69
|
+
action = 'Packing'
|
70
|
+
end
|
68
71
|
|
69
72
|
# Write encrypted/decryption action
|
70
73
|
enc_decrypt_result = raw_contents.send(packer_method, @key)
|
@@ -72,19 +75,19 @@ module Bcome
|
|
72
75
|
write_file(opposing_filename, enc_decrypt_result)
|
73
76
|
end
|
74
77
|
puts "\ndone".informational
|
75
|
-
end
|
76
|
-
|
78
|
+
end
|
79
|
+
|
77
80
|
def path_to_metadata
|
78
|
-
|
81
|
+
'bcome/metadata'
|
79
82
|
end
|
80
83
|
|
81
84
|
def write_file(filename, contents)
|
82
85
|
filepath = "#{path_to_metadata}/#{filename}"
|
83
|
-
File.open(
|
86
|
+
File.open(filepath.to_s, 'w') { |f| f.write(contents) }
|
84
87
|
end
|
85
|
-
|
88
|
+
|
86
89
|
def all_unencrypted_filenames
|
87
|
-
Dir["#{metadata_path}/*"].reject {|f| f =~ /\.enc/}
|
90
|
+
Dir["#{metadata_path}/*"].reject { |f| f =~ /\.enc/ }
|
88
91
|
end
|
89
92
|
|
90
93
|
def all_encrypted_filenames
|
@@ -92,8 +95,7 @@ module Bcome
|
|
92
95
|
end
|
93
96
|
|
94
97
|
def metadata_path
|
95
|
-
|
98
|
+
'bcome/metadata'
|
96
99
|
end
|
97
|
-
|
98
100
|
end
|
99
101
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class ArgumentErrorInvokingMethodFromCommmandLine < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Argument error invoking method. Please refer to documentation for invoking this command from the command line: '
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,15 +1,19 @@
|
|
1
|
-
|
2
|
-
class Base < RuntimeError
|
3
|
-
def initialize(message_suffix = nil)
|
4
|
-
@message_suffix = message_suffix
|
5
|
-
end
|
1
|
+
# frozen_string_literal: true
|
6
2
|
|
7
|
-
|
8
|
-
|
9
|
-
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class Base < RuntimeError
|
6
|
+
def initialize(message_suffix = nil)
|
7
|
+
@message_suffix = message_suffix
|
8
|
+
end
|
9
|
+
|
10
|
+
def message
|
11
|
+
"#{message_prefix}#{@message_suffix ? + (!message_prefix.empty? ? ':' : '').to_s + " #{@message_suffix}" : ''}"
|
12
|
+
end
|
10
13
|
|
11
|
-
|
12
|
-
|
14
|
+
def pretty_display
|
15
|
+
puts "\n\n#{message}\n".error
|
16
|
+
end
|
13
17
|
end
|
14
18
|
end
|
15
19
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class CanOnlySubselectOnInventory < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Invalid subselect - can only subselect on another inventory'
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class CannotFindInternalRegistryKlass < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Could not initialize orchestration method '
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class CannotFindSubselectionParent < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Cannot find subselection parent'
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class CantFindKeyInCloudTags < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Cannot find key in cloud tags '
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class CantFindKeyInMetadata < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Cannot find key in bcome metadata '
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class CantFindProxyHostByIdentifier < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Can\'t find proxy host by identifier'
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class CantFindProxyHostByNamespace < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Can\'t find proxy host by namespace'
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class CouldNotInitiateSshConnection < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Could not initiate SSH connection. Check your SSH config settings for namespace'
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class CouldNotInitiateSshConnectionThroughBackendProxy < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Could not initiate SSH connection. Check your SSH config settings for namespace'
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,11 +1,13 @@
|
|
1
|
-
|
2
|
-
class DeprecationWarning < ::Bcome::Exception::Base
|
1
|
+
# frozen_string_literal: true
|
3
2
|
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class DeprecationWarning < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
msg = "Your configuration relies on a deprecated version of Bcome, with which version #{::Bcome::VERSION} is not compatible.\n\n"
|
8
|
+
msg += 'Pin your bcome gem to version 0.7.0, or see our new documentation at https://github.com/webzakimbo/bcome-kontrol for changes'
|
9
|
+
msg
|
10
|
+
end
|
8
11
|
end
|
9
|
-
|
10
12
|
end
|
11
13
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class DuplicateCommandLineArgumentKey < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Duplicate command line argument key'
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class Ec2DriverMissingProvisioningRegion < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Missing provisioning region for network data: '
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|
@@ -1,7 +1,11 @@
|
|
1
|
-
|
2
|
-
|
3
|
-
|
4
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Bcome
|
4
|
+
module Exception
|
5
|
+
class FailedToRunLocalCommand < ::Bcome::Exception::Base
|
6
|
+
def message_prefix
|
7
|
+
'Failed to run local command: '
|
8
|
+
end
|
5
9
|
end
|
6
10
|
end
|
7
11
|
end
|