aspera-cli 4.23.0 → 4.24.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.
Files changed (109) hide show
  1. checksums.yaml +4 -4
  2. checksums.yaml.gz.sig +0 -0
  3. data/CHANGELOG.md +32 -1
  4. data/CONTRIBUTING.md +86 -29
  5. data/README.md +1651 -856
  6. data/bin/ascli +2 -1
  7. data/bin/asession +4 -4
  8. data/lib/aspera/agent/base.rb +4 -0
  9. data/lib/aspera/agent/connect.rb +20 -18
  10. data/lib/aspera/agent/desktop.rb +14 -11
  11. data/lib/aspera/agent/direct.rb +39 -31
  12. data/lib/aspera/agent/httpgw.rb +2 -2
  13. data/lib/aspera/agent/node.rb +9 -11
  14. data/lib/aspera/agent/transferd.rb +18 -11
  15. data/lib/aspera/api/aoc.rb +44 -31
  16. data/lib/aspera/api/cos_node.rb +7 -5
  17. data/lib/aspera/api/httpgw.rb +15 -18
  18. data/lib/aspera/api/node.rb +104 -22
  19. data/lib/aspera/ascmd.rb +22 -16
  20. data/lib/aspera/ascp/installation.rb +37 -40
  21. data/lib/aspera/ascp/management.rb +5 -4
  22. data/lib/aspera/assert.rb +54 -23
  23. data/lib/aspera/cli/basic_auth_plugin.rb +8 -7
  24. data/lib/aspera/cli/error.rb +1 -1
  25. data/lib/aspera/cli/extended_value.rb +28 -29
  26. data/lib/aspera/cli/formatter.rb +191 -168
  27. data/lib/aspera/cli/hints.rb +29 -3
  28. data/lib/aspera/cli/main.rb +138 -107
  29. data/lib/aspera/cli/manager.rb +50 -30
  30. data/lib/aspera/cli/plugin.rb +148 -77
  31. data/lib/aspera/cli/plugin_factory.rb +2 -2
  32. data/lib/aspera/cli/plugins/aoc.rb +189 -70
  33. data/lib/aspera/cli/plugins/ats.rb +15 -13
  34. data/lib/aspera/cli/plugins/config.rb +86 -213
  35. data/lib/aspera/cli/plugins/console.rb +49 -18
  36. data/lib/aspera/cli/plugins/cos.rb +4 -4
  37. data/lib/aspera/cli/plugins/faspex.rb +45 -51
  38. data/lib/aspera/cli/plugins/faspex5.rb +162 -163
  39. data/lib/aspera/cli/plugins/faspio.rb +6 -5
  40. data/lib/aspera/cli/plugins/httpgw.rb +2 -2
  41. data/lib/aspera/cli/plugins/node.rb +144 -162
  42. data/lib/aspera/cli/plugins/orchestrator.rb +10 -14
  43. data/lib/aspera/cli/plugins/preview.rb +26 -29
  44. data/lib/aspera/cli/plugins/server.rb +28 -28
  45. data/lib/aspera/cli/plugins/shares.rb +40 -28
  46. data/lib/aspera/cli/sync_actions.rb +101 -80
  47. data/lib/aspera/cli/transfer_agent.rb +51 -50
  48. data/lib/aspera/cli/transfer_progress.rb +29 -20
  49. data/lib/aspera/cli/version.rb +1 -1
  50. data/lib/aspera/cli/wizard.rb +160 -0
  51. data/lib/aspera/colors.rb +13 -8
  52. data/lib/aspera/command_line_builder.rb +28 -22
  53. data/lib/aspera/command_line_converter.rb +31 -0
  54. data/lib/aspera/environment.rb +144 -101
  55. data/lib/aspera/faspex_gw.rb +1 -1
  56. data/lib/aspera/faspex_postproc.rb +3 -2
  57. data/lib/aspera/hash_ext.rb +1 -1
  58. data/lib/aspera/id_generator.rb +10 -10
  59. data/lib/aspera/keychain/base.rb +18 -0
  60. data/lib/aspera/keychain/encrypted_hash.rb +6 -12
  61. data/lib/aspera/keychain/factory.rb +9 -3
  62. data/lib/aspera/keychain/hashicorp_vault.rb +9 -6
  63. data/lib/aspera/keychain/macos_security.rb +13 -13
  64. data/lib/aspera/log.rb +69 -20
  65. data/lib/aspera/nagios.rb +5 -6
  66. data/lib/aspera/node_simulator.rb +12 -7
  67. data/lib/aspera/oauth/base.rb +5 -3
  68. data/lib/aspera/oauth/factory.rb +24 -18
  69. data/lib/aspera/oauth/jwt.rb +13 -1
  70. data/lib/aspera/oauth/url_json.rb +3 -3
  71. data/lib/aspera/oauth/web.rb +5 -3
  72. data/lib/aspera/persistency_folder.rb +2 -2
  73. data/lib/aspera/preview/file_types.rb +4 -3
  74. data/lib/aspera/preview/generator.rb +25 -12
  75. data/lib/aspera/preview/terminal.rb +10 -7
  76. data/lib/aspera/preview/utils.rb +11 -9
  77. data/lib/aspera/products/connect.rb +1 -1
  78. data/lib/aspera/products/desktop.rb +1 -1
  79. data/lib/aspera/products/other.rb +2 -2
  80. data/lib/aspera/products/transferd.rb +8 -6
  81. data/lib/aspera/proxy_auto_config.rb +1 -1
  82. data/lib/aspera/rest.rb +29 -22
  83. data/lib/aspera/rest_call_error.rb +1 -1
  84. data/lib/aspera/resumer.rb +1 -1
  85. data/lib/aspera/secret_hider.rb +46 -40
  86. data/lib/aspera/ssh.rb +13 -3
  87. data/lib/aspera/sync/args.schema.yaml +102 -0
  88. data/lib/aspera/sync/conf.schema.yaml +701 -0
  89. data/lib/aspera/sync/database.rb +83 -0
  90. data/lib/aspera/{transfer/sync.rb → sync/operations.rb} +132 -65
  91. data/lib/aspera/temp_file_manager.rb +3 -2
  92. data/lib/aspera/transfer/error.rb +1 -1
  93. data/lib/aspera/transfer/error_info.rb +1 -2
  94. data/lib/aspera/transfer/faux_file.rb +11 -10
  95. data/lib/aspera/transfer/parameters.rb +6 -5
  96. data/lib/aspera/transfer/spec.rb +15 -1
  97. data/lib/aspera/transfer/spec.schema.yaml +316 -293
  98. data/lib/aspera/transfer/spec_doc.rb +34 -16
  99. data/lib/aspera/transfer/uri.rb +5 -5
  100. data/lib/aspera/uri_reader.rb +14 -10
  101. data/lib/aspera/web_auth.rb +2 -2
  102. data/lib/aspera/web_server_simple.rb +2 -2
  103. data.tar.gz.sig +0 -0
  104. metadata +15 -13
  105. metadata.gz.sig +2 -2
  106. data/lib/aspera/transfer/async_conf.schema.yaml +0 -716
  107. data/lib/aspera/transfer/convert.rb +0 -29
  108. data/lib/aspera/transfer/sync_instance.schema.yaml +0 -20
  109. data/lib/aspera/transfer/sync_session.schema.yaml +0 -86
@@ -12,51 +12,69 @@ module Aspera
12
12
  agent_sym.to_sym.eql?(:direct) ? :a : agent_sym.to_s[0].to_sym
13
13
  end
14
14
 
15
- # @columns formatter [Cli::Formatter] formatter to use, methods: special_format, check_row
16
- # @columns &block modify parameter info if needed
17
- # @return a table suitable to display in manual
18
- def man_table(formatter, cli: true)
15
+ # @param formatter [Cli::Formatter] Formatter to use, methods: special_format, check_row
16
+ # @param include_option [Boolean] true : include CLI options
17
+ # @return [Array] a table suitable to display in manual
18
+ def man_table(formatter, include_option: false, agent_columns: true)
19
19
  col_local = agent_to_short(:direct)
20
- Spec::SCHEMA['properties'].filter_map do |name, properties|
20
+ cols = agent_columns ? %i[name type] + AGENT_LIST.map(&:last) + %i[description] : %i[name type description]
21
+ rows = Spec::SCHEMA['properties'].filter_map do |name, properties|
21
22
  # manual table
22
23
  columns = {
23
24
  name: name,
24
25
  type: properties['type'],
25
26
  description: []
26
27
  }
27
- # replace "back solidus" HTML entity with its text value and split lines
28
- columns[:description].concat(properties['description'].gsub('\', '\\').split("\n")) if properties.key?('description')
28
+ # replace "back solidus" HTML entity with its text value
29
+ #
30
+ # split lines
31
+ columns[:description] =
32
+ properties['description']
33
+ .gsub('\', '\\')
34
+ .gsub(/`([a-z0-9_.+-]+)`/){formatter.keyword_highlight(Regexp.last_match(1))}
35
+ .split("\n") if properties.key?('description')
29
36
  columns[:description].unshift("DEPRECATED: #{properties['x-deprecation']}") if properties.key?('x-deprecation')
30
37
  # add flags for supported agents in doc
38
+ agents = []
31
39
  AGENT_LIST.each do |agent_info|
32
- columns[agent_info.last] = Cli::Formatter.tick(properties['x-agents'].nil? || properties['x-agents'].include?(agent_info.first.to_s))
40
+ agents.push(agent_info.last) if properties['x-agents'].nil? || properties['x-agents'].include?(agent_info.first.to_s)
41
+ end
42
+ agents.push(col_local) if properties['x-cli-option'] && !agents.include?(col_local)
43
+ if agent_columns
44
+ AGENT_LIST.each do |agent_info|
45
+ columns[agent_info.last] = formatter.tick(agents.include?(agent_info.last))
46
+ end
47
+ else
48
+ columns[:description].push("(#{agents.map(&:upcase).join(', ')})") unless agents.length.eql?(AGENT_LIST.length)
33
49
  end
34
- columns[col_local] = Cli::Formatter.tick(true) if properties['x-cli-option']
35
50
  # only keep lines that are usable in supported agents
36
- next false if AGENT_LIST.map(&:last).inject(true){ |memory, agent_short_sym| memory && columns[agent_short_sym].empty?}
37
- columns[:description].push("Allowed values: #{properties['enum'].join(', ')}") if properties.key?('enum')
51
+ next false if agents.empty?
52
+ columns[:description].push("Allowed values: #{properties['enum'].map{ |v| formatter.keyword_highlight(v)}.join(', ')}") if properties.key?('enum')
53
+ envvar = ''
38
54
  cli_option =
39
- if properties['x-cli-switch']
55
+ if properties.key?('x-cli-envvar')
56
+ envvar = 'env:'
57
+ properties['x-cli-envvar']
58
+ elsif properties['x-cli-switch']
40
59
  properties['x-cli-option']
41
60
  elsif properties['x-cli-special']
42
- formatter.special_format('special')
61
+ ''
43
62
  elsif properties['x-cli-option']
44
63
  arg_type = properties.key?('enum') ? '{enum}' : "{#{[properties['type']].flatten.join('|')}}"
45
64
  conversion_tag = properties.key?('x-cli-convert') ? '(conversion)' : ''
46
65
  sep = properties['x-cli-option'].start_with?('--') ? '=' : ' '
47
66
  "#{properties['x-cli-option']}#{sep}#{conversion_tag}#{arg_type}"
48
67
  end
49
- cli_option = 'env:' + properties['x-cli-envvar'] if properties.key?('x-cli-envvar')
50
- columns[:description].push("(#{cli_option})") if cli && !cli_option.to_s.empty?
68
+ columns[:description].push("(#{envvar}#{formatter.keyword_highlight(cli_option)})") if include_option && !cli_option.to_s.empty?
51
69
  formatter.check_row(columns)
52
70
  end.sort_by{ |i| i[:name]}
71
+ [cols, rows]
53
72
  end
54
73
  end
55
74
  # Agents shown in manual for parameters (sub list)
56
75
  AGENT_LIST = Agent::Base.agent_list.map do |agent_sym|
57
76
  [agent_sym, agent_sym.to_s.capitalize, agent_to_short(agent_sym)]
58
77
  end.sort_by(&:last).freeze
59
- TABLE_COLUMNS = (%i[name type] + AGENT_LIST.map(&:last) + %i[description]).freeze
60
78
  end
61
79
  end
62
80
  end
@@ -4,7 +4,7 @@
4
4
 
5
5
  require 'aspera/log'
6
6
  require 'aspera/rest'
7
- require 'aspera/transfer/convert'
7
+ require 'aspera/command_line_converter'
8
8
 
9
9
  module Aspera
10
10
  module Transfer
@@ -39,10 +39,10 @@ module Aspera
39
39
  when 'bwcap' then result_ts['target_rate_cap_kbps'] = value.to_i
40
40
  when 'enc' then result_ts['cipher'] = value.gsub(/^aes/, 'aes-').gsub(/cfb$/, '-cfb').gsub(/gcm$/, '-gcm').gsub('--', '-')
41
41
  when 'tags64' then result_ts['tags'] = JSON.parse(Base64.strict_decode64(value))
42
- when 'createpath' then result_ts['create_dir'] = Convert.yes_to_true(value)
43
- when 'fallback' then result_ts['http_fallback'] = Convert.yes_to_true(value)
44
- when 'lockpolicy' then result_ts['lock_rate_policy'] = Convert.yes_to_true(value)
45
- when 'lockminrate' then result_ts['lock_min_rate'] = Convert.yes_to_true(value)
42
+ when 'createpath' then result_ts['create_dir'] = CommandLineConverter.yes_to_true(value)
43
+ when 'fallback' then result_ts['http_fallback'] = CommandLineConverter.yes_to_true(value)
44
+ when 'lockpolicy' then result_ts['lock_rate_policy'] = CommandLineConverter.yes_to_true(value)
45
+ when 'lockminrate' then result_ts['lock_min_rate'] = CommandLineConverter.yes_to_true(value)
46
46
  when 'auth' then Log.log.debug{"ignoring #{name}=#{value}"} # Not used (yes/no)
47
47
  when 'v' then Log.log.debug{"ignoring #{name}=#{value}"} # rubocop:disable Lint/DuplicateBranch -- Not used (shall be 2)
48
48
  when 'protect' then Log.log.debug{"ignoring #{name}=#{value}"} # rubocop:disable Lint/DuplicateBranch -- TODO: what is this ?
@@ -6,33 +6,37 @@ require 'aspera/rest'
6
6
  require 'aspera/temp_file_manager'
7
7
 
8
8
  module Aspera
9
- # read some content from some URI, support file: , http: and https: schemes
9
+ # Read some content from some URI, support file: , http: and https: schemes
10
10
  module UriReader
11
- FILE_SCHEME_PREFIX = 'file:///'
12
- private_constant :FILE_SCHEME_PREFIX
11
+ SCHEME_FILE = 'file'
12
+ SCHEME_FILE_PFX1 = "#{SCHEME_FILE}:"
13
+ SCHEME_FILE_PFX2 = "#{SCHEME_FILE_PFX1}///"
14
+ private_constant :SCHEME_FILE, :SCHEME_FILE_PFX1, :SCHEME_FILE_PFX2
13
15
  class << self
14
- # read some content from some URI, support file: , http: and https: schemes
16
+ # Read some content from some URI, support file: , http: and https: schemes
15
17
  def read(uri_to_read)
16
18
  uri = URI.parse(uri_to_read)
17
19
  case uri.scheme
18
20
  when 'http', 'https'
19
21
  return Rest.new(base_url: uri_to_read, redirect_max: 5).call(operation: 'GET', headers: {'Accept' => '*/*'})[:data]
20
- when 'file', NilClass
22
+ when SCHEME_FILE, NilClass
21
23
  local_file_path = uri.path
22
- raise 'URL shall have a path, check syntax' if local_file_path.nil?
24
+ raise Error, 'URL shall have a path, check syntax' if local_file_path.nil?
23
25
  local_file_path = File.expand_path(local_file_path.gsub(%r{^/}, '')) if %r{^/(~|.|..)/}.match?(local_file_path)
24
26
  return File.read(local_file_path)
25
27
  else Aspera.error_unexpected_value(uri.scheme){"scheme for [#{uri_to_read}]"}
26
28
  end
27
29
  end
28
30
 
29
- # @return path to file with content at URL
31
+ # @return Path to file with content at URL
30
32
  def read_as_file(url)
31
- if url.start_with?('file:')
33
+ if url.start_with?(SCHEME_FILE_PFX1)
34
+ # for file scheme, return directly the path
32
35
  # require specific file scheme: the path part is "relative", or absolute if there are 4 slash
33
- raise "use format: #{FILE_SCHEME_PREFIX}<path>" unless url.start_with?(FILE_SCHEME_PREFIX)
34
- return File.expand_path(url[FILE_SCHEME_PREFIX.length..-1])
36
+ raise "use format: #{SCHEME_FILE_PFX2}<path>" unless url.start_with?(SCHEME_FILE_PFX2)
37
+ return File.expand_path(url[SCHEME_FILE_PFX2.length..-1])
35
38
  else
39
+ # download to temp file
36
40
  # autodelete on exit
37
41
  sdk_archive_path = TempFileManager.instance.new_file_path_global(suffix: File.basename(url))
38
42
  Aspera::Rest.new(base_url: url, redirect_max: 3).call(operation: 'GET', save_to_file: sdk_archive_path)
@@ -16,7 +16,7 @@ module Aspera
16
16
 
17
17
  def service(request, response)
18
18
  Log.log.debug{"received request from browser #{request.request_method} #{request.path}"}
19
- Aspera.assert_values(request.request_method, ['GET'], exception_class: WEBrick::HTTPStatus::MethodNotAllowed){'HTTP verb'}
19
+ Aspera.assert_values(request.request_method, ['GET'], type: WEBrick::HTTPStatus::MethodNotAllowed){'HTTP verb'}
20
20
  additionnal_info = @web_auth.signal_request(request)
21
21
  response.status = 200
22
22
  response.content_type = 'text/html'
@@ -161,7 +161,7 @@ module Aspera
161
161
  </html>
162
162
  HTML
163
163
 
164
- return nil
164
+ return
165
165
  end
166
166
  end
167
167
 
@@ -72,7 +72,7 @@ module Aspera
72
72
  elsif cert && PKCS12_EXT.include?(File.extname(cert).downcase)
73
73
  # PKCS12
74
74
  Log.log.debug('Using PKCS12 certificate')
75
- raise 'PKCS12 requires a key (password)' if key.nil?
75
+ raise Error, 'PKCS12 requires a key (password)' if key.nil?
76
76
  pkcs12 = OpenSSL::PKCS12.new(File.read(cert), key)
77
77
  webrick_options[:SSLCertificate] = pkcs12.certificate
78
78
  webrick_options[:SSLPrivateKey] = pkcs12.key
@@ -90,7 +90,7 @@ module Aspera
90
90
  OpenSSL::X509::Certificate.new(File.read(cert))
91
91
  end
92
92
  webrick_options[:SSLExtraChainCert] = read_chain_file(chain) unless chain.nil?
93
- raise 'key and cert do not match' unless webrick_options[:SSLCertificate].public_key.to_der == webrick_options[:SSLPrivateKey].public_key.to_der
93
+ raise Error, 'key and cert do not match' unless webrick_options[:SSLCertificate].public_key.to_der == webrick_options[:SSLPrivateKey].public_key.to_der
94
94
  end
95
95
  end
96
96
  # call constructor of parent class, but capture STDERR
data.tar.gz.sig CHANGED
Binary file
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: aspera-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 4.23.0
4
+ version: 4.24.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Laurent Martin
@@ -37,7 +37,7 @@ cert_chain:
37
37
  eTf9kxhVM40wGQOECVNA8UsEEZHD48eF+csUYZtAJOF5oxTI8UyV9T/o6CgO0c9/
38
38
  Gzz+Qm5ULOUcPiJLjSpaiTrkiIVYiDGnqNSr6R1Hb1c=
39
39
  -----END CERTIFICATE-----
40
- date: 2025-08-12 00:00:00.000000000 Z
40
+ date: 2025-09-30 00:00:00.000000000 Z
41
41
  dependencies:
42
42
  - !ruby/object:Gem::Dependency
43
43
  name: blankslate
@@ -87,14 +87,14 @@ dependencies:
87
87
  requirements:
88
88
  - - "~>"
89
89
  - !ruby/object:Gem::Version
90
- version: '2.0'
90
+ version: '3.0'
91
91
  type: :runtime
92
92
  prerelease: false
93
93
  version_requirements: !ruby/object:Gem::Requirement
94
94
  requirements:
95
95
  - - "~>"
96
96
  - !ruby/object:Gem::Version
97
- version: '2.0'
97
+ version: '3.0'
98
98
  - !ruby/object:Gem::Dependency
99
99
  name: mime-types
100
100
  requirement: !ruby/object:Gem::Requirement
@@ -157,28 +157,28 @@ dependencies:
157
157
  requirements:
158
158
  - - "~>"
159
159
  - !ruby/object:Gem::Version
160
- version: '2.0'
160
+ version: '3.1'
161
161
  type: :runtime
162
162
  prerelease: false
163
163
  version_requirements: !ruby/object:Gem::Requirement
164
164
  requirements:
165
165
  - - "~>"
166
166
  - !ruby/object:Gem::Version
167
- version: '2.0'
167
+ version: '3.1'
168
168
  - !ruby/object:Gem::Dependency
169
169
  name: terminal-table
170
170
  requirement: !ruby/object:Gem::Requirement
171
171
  requirements:
172
172
  - - "~>"
173
173
  - !ruby/object:Gem::Version
174
- version: 3.0.2
174
+ version: '4.0'
175
175
  type: :runtime
176
176
  prerelease: false
177
177
  version_requirements: !ruby/object:Gem::Requirement
178
178
  requirements:
179
179
  - - "~>"
180
180
  - !ruby/object:Gem::Version
181
- version: 3.0.2
181
+ version: '4.0'
182
182
  - !ruby/object:Gem::Dependency
183
183
  name: tty-spinner
184
184
  requirement: !ruby/object:Gem::Requirement
@@ -325,8 +325,10 @@ files:
325
325
  - lib/aspera/cli/transfer_agent.rb
326
326
  - lib/aspera/cli/transfer_progress.rb
327
327
  - lib/aspera/cli/version.rb
328
+ - lib/aspera/cli/wizard.rb
328
329
  - lib/aspera/colors.rb
329
330
  - lib/aspera/command_line_builder.rb
331
+ - lib/aspera/command_line_converter.rb
330
332
  - lib/aspera/coverage.rb
331
333
  - lib/aspera/data/1
332
334
  - lib/aspera/data/2
@@ -341,6 +343,7 @@ files:
341
343
  - lib/aspera/hash_ext.rb
342
344
  - lib/aspera/id_generator.rb
343
345
  - lib/aspera/json_rpc.rb
346
+ - lib/aspera/keychain/base.rb
344
347
  - lib/aspera/keychain/encrypted_hash.rb
345
348
  - lib/aspera/keychain/factory.rb
346
349
  - lib/aspera/keychain/hashicorp_vault.rb
@@ -378,10 +381,12 @@ files:
378
381
  - lib/aspera/resumer.rb
379
382
  - lib/aspera/secret_hider.rb
380
383
  - lib/aspera/ssh.rb
384
+ - lib/aspera/sync/args.schema.yaml
385
+ - lib/aspera/sync/conf.schema.yaml
386
+ - lib/aspera/sync/database.rb
387
+ - lib/aspera/sync/operations.rb
381
388
  - lib/aspera/temp_file_manager.rb
382
389
  - lib/aspera/timer_limiter.rb
383
- - lib/aspera/transfer/async_conf.schema.yaml
384
- - lib/aspera/transfer/convert.rb
385
390
  - lib/aspera/transfer/error.rb
386
391
  - lib/aspera/transfer/error_info.rb
387
392
  - lib/aspera/transfer/faux_file.rb
@@ -389,9 +394,6 @@ files:
389
394
  - lib/aspera/transfer/spec.rb
390
395
  - lib/aspera/transfer/spec.schema.yaml
391
396
  - lib/aspera/transfer/spec_doc.rb
392
- - lib/aspera/transfer/sync.rb
393
- - lib/aspera/transfer/sync_instance.schema.yaml
394
- - lib/aspera/transfer/sync_session.schema.yaml
395
397
  - lib/aspera/transfer/uri.rb
396
398
  - lib/aspera/uri_reader.rb
397
399
  - lib/aspera/web_auth.rb
metadata.gz.sig CHANGED
@@ -1,2 +1,2 @@
1
- &�O��[�p� ��}H*����"�E�F��7@�x����ݤ �g|�*��69ٯ�;�T�[��k�K�y������cߏI���)Ў��6�
2
- u,�zEl}¤R�.���VR�?8��ɤ,�%|���(�j ��@�=&k>W$?c&!��5K��<̀�soܯx&l �=]�����9ۀNb{�(Y��ݟ�_�ю��p@{��`��4�9?H~R��w�;������V\�Ho-�jT� n����:���XG@D�Y'oM�"���≠=��E-iK� +���s��/�Vg&��PϽ�QS��fښ`��nBH�!���P�z<�<AQ������e��a\�����J���~(h����|�M|���~Gi
1
+ ��O5)Z ��
2
+ ��}`:H�,��a$ɪ^|�� toHG���c���Ԑ��c��~���dth!��VvB7�