squared 0.0.7 → 0.0.8

Sign up to get free protection for your applications and to get access to all the features.
@@ -8,6 +8,7 @@ module Squared
8
8
  module Project
9
9
  class Base
10
10
  include Common
11
+ include Format
11
12
  include System
12
13
  include Shell
13
14
  include Task
@@ -44,7 +45,6 @@ module Squared
44
45
  @@tasks = {}
45
46
 
46
47
  attr_reader :name, :project, :workspace, :group, :path, :theme
47
- attr_accessor :warning
48
48
 
49
49
  def initialize(name, path, workspace, *, group: nil, **kwargs)
50
50
  @name = name.to_s
@@ -58,8 +58,6 @@ module Squared
58
58
  @output = [kwargs[:run], nil]
59
59
  @copy = kwargs[:copy]
60
60
  @clean = kwargs[:clean]
61
- @exclude = as_a(kwargs[:exclude])
62
- @warning = workspace.warning
63
61
  @theme = if !workspace.verbose
64
62
  {}
65
63
  elsif kwargs.fetch(:common, true)
@@ -67,6 +65,9 @@ module Squared
67
65
  else
68
66
  __get__(:theme)[:project][to_sym] ||= {}
69
67
  end
68
+ @ref = []
69
+ @exclude = as_a(kwargs[:exclude], :to_sym).freeze
70
+ initialize_ref(Base.ref)
70
71
  initialize_logger(**kwargs)
71
72
  end
72
73
 
@@ -91,7 +92,7 @@ module Squared
91
92
  raise if @workspace.exception
92
93
 
93
94
  file = nil
94
- warn e if @warning
95
+ warn e if @workspace.warning
95
96
  end
96
97
  end
97
98
  log[:progname] = @name
@@ -118,23 +119,30 @@ module Squared
118
119
  end
119
120
 
120
121
  def initialize_script(ref, **)
122
+ initialize_ref(ref)
121
123
  return unless (script = workspace.script(group: group, ref: ref))
122
124
 
123
125
  @depend = script[:depend] if @depend.nil?
124
126
  @doc = script[:doc] if @doc.nil?
125
127
  @test = script[:test] if @test.nil?
126
128
  @clean = script[:clean] if @clean.nil?
129
+ @exclude = script[:exclude] if @exclude.empty? && script.key?(:exclude)
127
130
  @script = script
128
131
  end
129
132
 
133
+ def initialize_ref(ref)
134
+ @ref << ref unless @exclude.include?(ref)
135
+ end
136
+
130
137
  def populate(*)
131
- return if @exclude.include?(Base.ref)
138
+ valid = ref?(Base.ref)
139
+ series = workspace.series
132
140
 
133
141
  namespace name do
134
- workspace.series.each_key do |key|
135
- next unless Application::WORKSPACE_KEYS.include?(key) ? has?(key) : workspace.task_include?(self, key)
142
+ series.each_key do |key|
143
+ next unless series.include?(key) ? has?(key) && valid : workspace.task_extend?(self, key)
136
144
 
137
- desc message(name, key)
145
+ desc message(*name.split(':'), key)
138
146
  task key do
139
147
  __send__(key)
140
148
  end
@@ -170,7 +178,7 @@ module Squared
170
178
  build(sync: invoked_sync?('depend'))
171
179
  key = "#{name}:copy"
172
180
  if workspace.task_defined?(key)
173
- invoke key
181
+ invoke(key, exception: workspace.exception, warning: workspace.warning)
174
182
  else
175
183
  copy
176
184
  end
@@ -251,6 +259,10 @@ module Squared
251
259
  respond_to?(m = :"#{method}?") && __send__(m)
252
260
  end
253
261
 
262
+ def ref?(val)
263
+ @ref.include?(val)
264
+ end
265
+
254
266
  def build?
255
267
  !!@output[0]
256
268
  end
@@ -283,17 +295,19 @@ module Squared
283
295
  !!@dev
284
296
  end
285
297
 
286
- protected
298
+ private
287
299
 
288
300
  def run(cmd = @session, exception: workspace.exception, banner: true, sync: true, req: nil, **)
289
- return if req && !base_path(req).exist?
290
-
301
+ if req && !base_path(req).exist?
302
+ log.warn "#{req} (not found)"
303
+ return
304
+ end
291
305
  cmd = close_session(cmd)
292
306
  log.info cmd
293
307
  begin
294
308
  if cmd =~ /^\S+:(\S+:?)+$/ && workspace.task_defined?(cmd)
295
309
  print_item if sync
296
- invoke(cmd, exception: exception)
310
+ invoke(cmd, exception: exception, warning: workspace.warning)
297
311
  else
298
312
  print_item format_banner(cmd, banner: banner) if sync
299
313
  shell(cmd, chdir: path, exception: exception)
@@ -309,7 +323,8 @@ module Squared
309
323
  end
310
324
 
311
325
  def env(key, default = nil, equals: nil, ignore: ['0'].freeze, suffix: nil, strict: false)
312
- a = "#{key}_#{name.gsub(/[^\w]+/, '_').upcase}"
326
+ @env ||= name.gsub(/[^\w]+/, '_').upcase
327
+ a = "#{key}_#{@env}"
313
328
  b = ''
314
329
  if suffix
315
330
  a = [a, suffix].flatten.join('_')
@@ -381,13 +396,14 @@ module Squared
381
396
  ret.join("\n")
382
397
  end
383
398
 
384
- def format_desc(action, flag, opts = nil, req: 'opts*')
385
- opts = "#{req}=#{opts.join(',')}" if opts.is_a?(::Array)
386
- if !flag
399
+ def format_desc(action, flag, opts = nil, req: '', arg: 'opts*')
400
+ opts = "#{arg}=#{opts.join(',')}" if opts.is_a?(::Array)
401
+ unless flag
387
402
  flag = action
388
403
  action = ''
389
404
  end
390
- message(name, action, opts ? "#{flag}[#{opts}]" : flag)
405
+ req = opts ? "#{req}," : "[#{req}]" unless req.to_s.empty?
406
+ message(*name.split(':'), action, opts ? "#{flag}[#{req}#{opts}]" : flag.to_s + req)
391
407
  end
392
408
 
393
409
  def format_banner(cmd, banner: true, multiple: false)
@@ -457,8 +473,8 @@ module Squared
457
473
  workspace.pipe
458
474
  end
459
475
 
460
- def invoked_sync?(action)
461
- return true if workspace.series.sync?("#{action}:sync")
476
+ def invoked_sync?(action, flag = nil)
477
+ return true if !flag.nil? || workspace.series.sync?("#{action}:sync")
462
478
 
463
479
  check = lambda do |val|
464
480
  if invoked?(val)
@@ -4,8 +4,6 @@ module Squared
4
4
  module Workspace
5
5
  module Project
6
6
  class Git < Base
7
- include Format
8
-
9
7
  OPT_PULL = %w[all tags prune ff-only autostash dry-run].freeze
10
8
  OPT_FETCH = %w[tags prune prune-tags depth=n dry-run].freeze
11
9
  private_constant :OPT_PULL, :OPT_FETCH
@@ -13,23 +11,26 @@ module Squared
13
11
  class << self
14
12
  include ::Rake::DSL
15
13
 
16
- def populate(workspace, parallel: [], **)
14
+ def populate(workspace, **)
17
15
  return if workspace.series.pull.empty?
18
16
 
19
17
  desc 'all[git?=rebase|stash]'
20
18
  task 'all', [:git] do |_, args|
21
- sync = ->(key) { parallel.include?(key) ? :"#{key}:sync" : key }
19
+ exception = workspace.exception
20
+ warning = workspace.warning
21
+ sync = ->(key) { workspace.task_defined?(s = "#{key}:sync") ? s : key }
22
22
  pull = case args.git
23
23
  when 'rebase'
24
- sync.(:rebase)
24
+ sync.('rebase')
25
25
  when 'stash'
26
- invoke sync.(:stash)
27
- sync.(:pull)
26
+ invoke(sync.('stash'), exception: exception, warning: warning)
27
+ sync.('pull')
28
28
  else
29
- sync.(:pull)
29
+ sync.('pull')
30
30
  end
31
- Common::Task.invoke(pull, exception: workspace.exception)
32
- Common::Task.invoke(workspace.dev? ? :refresh : :build, exception: workspace.exception)
31
+ Common::Task.invoke(pull, exception: exception, warning: warning)
32
+ Common::Task.invoke(workspace.dev? && workspace.series.has?(:refresh) ? :refresh : :build,
33
+ exception: exception, warning: warning)
33
34
  end
34
35
  end
35
36
 
@@ -60,9 +61,14 @@ module Squared
60
61
  rev: %i[commit branch]
61
62
  }.freeze
62
63
 
64
+ def initialize(*, **)
65
+ super
66
+ initialize_ref(Git.ref)
67
+ end
68
+
63
69
  def populate(*)
64
70
  super
65
- return unless gitdir.exist? && !@exclude.include?(Git.ref)
71
+ return unless gitdir.exist? && ref?(Git.ref)
66
72
 
67
73
  namespace name do
68
74
  @@tasks[Git.ref].each do |action, flags|
@@ -121,7 +127,7 @@ module Squared
121
127
  desc format_desc(action, flag, 'index?=0,pathspec*')
122
128
  task flag, [:pathspec] do |_, args|
123
129
  files = args.to_a
124
- index = /^\d+$/.match?(files.first) && !option('index') ? files.shift.to_i : 0
130
+ index = /^\d+$/.match?(files.first) && !git_option('index') ? files.shift.to_i : 0
125
131
  diff(flag, files, index: index)
126
132
  end
127
133
  when :cached
@@ -202,12 +208,12 @@ module Squared
202
208
  cmd = git_session 'pull'
203
209
  if flag == :'no-rebase'
204
210
  cmd << '--no-rebase'
205
- elsif flag == :rebase || option('rebase')
211
+ elsif flag == :rebase || git_option('rebase')
206
212
  cmd << '--rebase'
207
213
  end
208
214
  if flag == :'no-commit'
209
215
  cmd << '--no-commit'
210
- elsif flag == :commit || option('commit')
216
+ elsif flag == :commit || git_option('commit')
211
217
  cmd << '--commit'
212
218
  end
213
219
  append_pull opts, OPT_PULL, flag
@@ -220,28 +226,28 @@ module Squared
220
226
 
221
227
  def fetch(flag = nil, opts: [])
222
228
  cmd = git_session 'fetch'
223
- cmd << '--all' if flag == :all || option('all')
229
+ cmd << '--all' if flag == :all || git_option('all')
224
230
  append_pull opts, OPT_FETCH, flag
225
231
  source(sync: invoked_sync?('fetch', flag), stderr: true, exception: !workspace.series.multiple?)
226
232
  end
227
233
 
228
- def stash(flag = :push, files = [], commit: nil)
229
- cmd = git_session 'stash', flag.to_s
234
+ def stash(flag = nil, files = [], commit: nil)
235
+ cmd = git_session 'stash', (flag || 'push').to_s
230
236
  case flag
231
237
  when :apply, :pop
232
- cmd << '--index' if option('index')
238
+ cmd << '--index' if git_option('index')
233
239
  cmd << commit
234
240
  else
235
241
  append_option %w[all staged include-untracked]
236
- append_message option('message', 'm', zero: false)
242
+ append_message git_option('message', 'm', zero: false)
237
243
  append_pathspec files
238
244
  end
239
245
  source(sync: invoked_sync?('stash', flag), exception: workspace.exception)
240
246
  end
241
247
 
242
248
  def status
243
- cmd = git_session 'status', option('long') ? '--long' : '--short'
244
- if (val = option('ignore-submodules'))
249
+ cmd = git_session 'status', git_option('long') ? '--long' : '--short'
250
+ if (val = git_option('ignore-submodules'))
245
251
  cmd << "--ignore-submodules=#{case val
246
252
  when '0', 'none'
247
253
  'none'
@@ -282,7 +288,7 @@ module Squared
282
288
  append_submodules flag
283
289
  else
284
290
  cmd << '--mixed'
285
- cmd << '--no-refresh' if option('refresh', equals: '0')
291
+ cmd << '--no-refresh' if git_option('refresh', equals: '0')
286
292
  end
287
293
  append_commit ref
288
294
  end
@@ -293,10 +299,10 @@ module Squared
293
299
  cmd = git_session 'checkout'
294
300
  case flag
295
301
  when :branch
296
- cmd << '--detach' if detach == 'd' || option('detach')
302
+ cmd << '--detach' if detach == 'd' || git_option('detach')
297
303
  if create
298
304
  cmd << "-#{create}" << branch
299
- if (val = option('start-point'))
305
+ if (val = git_option('start-point'))
300
306
  cmd << val
301
307
  end
302
308
  else
@@ -351,22 +357,22 @@ module Squared
351
357
  sha = nil
352
358
  end
353
359
  end
354
- if (val = option('unified')).to_i > 0
360
+ if (val = git_option('unified')).to_i > 0
355
361
  cmd << "--unified=#{val}"
356
362
  end
357
363
  append_nocolor
358
364
  case flag
359
365
  when :cached
360
366
  cmd << '--cached'
361
- cmd << '--merge-base' if option('merge-base')
367
+ cmd << '--merge-base' if git_option('merge-base')
362
368
  when :branch
363
369
  cmd << branch
364
370
  when :files
365
371
  cmd << '--no-index'
366
372
  else
367
- if (val = option('index')) || index > 0
373
+ if (val = git_option('index')) || index > 0
368
374
  cmd << "HEAD~#{val || index}"
369
- elsif sha && option('merge-base')
375
+ elsif sha && git_option('merge-base')
370
376
  cmd << '--merge-base'
371
377
  end
372
378
  end
@@ -376,7 +382,7 @@ module Squared
376
382
  end
377
383
 
378
384
  def commit(flag, files = [], message: nil, pass: false)
379
- message ||= option('message', 'm', zero: false)
385
+ message ||= git_option('message', 'm', zero: false)
380
386
  amend = flag.to_s.start_with?('amend')
381
387
  if !message && !amend
382
388
  return if pass
@@ -391,7 +397,7 @@ module Squared
391
397
  "-- #{files.join(' ')}"
392
398
  end
393
399
  if !push?
394
- source('git branch -vv --list', io: true, banner: false)[0].each do |val|
400
+ source('git branch -vv --list', io: true, banner: false).first.each do |val|
395
401
  origin = %r{^\* [^\[]+(?<= )\[([\w.-/]+?)/([\w.-]+)\] }.match(val)
396
402
  next unless origin
397
403
 
@@ -403,7 +409,7 @@ module Squared
403
409
  raise_error('commit', 'work tree is not usable') unless push?
404
410
 
405
411
  cmd = git_session 'commit'
406
- cmd << '--dry-run' if option('dry-run')
412
+ cmd << '--dry-run' if git_option('dry-run')
407
413
  if amend
408
414
  cmd << '--amend'
409
415
  else
@@ -411,7 +417,7 @@ module Squared
411
417
  end
412
418
  if message
413
419
  append_message message
414
- elsif flag == :'amend-orig' || option('no-edit')
420
+ elsif flag == :'amend-orig' || git_option('no-edit')
415
421
  cmd << '--no-edit'
416
422
  end
417
423
  a = ['git add --verbose']
@@ -440,14 +446,14 @@ module Squared
440
446
  source(stdout: true)
441
447
  end
442
448
 
443
- protected
449
+ private
444
450
 
445
451
  def source(cmd = @session, exception: true, banner: true, io: false, sync: true, stdout: false, stderr: false)
446
452
  cmd = close_session(cmd)
447
453
  log.info cmd
454
+ banner = format_banner(cmd.gsub(File.join(path, ''), ''), banner: banner, multiple: true)
455
+ cmd = cmd.sub(/^git\b/, "git --work-tree #{shell_quote(path)} --git-dir #{shell_quote(gitdir)}")
448
456
  begin
449
- banner = format_banner(cmd.gsub(File.join(path, ''), ''), banner: banner, multiple: true)
450
- cmd = cmd.sub(/^git\b/, "git --work-tree #{shell_quote(path)} --git-dir #{shell_quote(gitdir)}")
451
457
  if io
452
458
  [IO.popen(cmd), banner]
453
459
  elsif pipe? ? sync : stdout
@@ -480,7 +486,7 @@ module Squared
480
486
  log.error e
481
487
  raise if exception
482
488
 
483
- warn e
489
+ warn e if workspace.warning
484
490
  end
485
491
  end
486
492
 
@@ -526,14 +532,6 @@ module Squared
526
532
  files.map { |val| val == '.' ? '.' : shell_quote(base_path(val.strip)) }
527
533
  end
528
534
 
529
- def source_path?(val)
530
- return val.to_s.start_with?(File.join(path, '').to_s) if Pathname.new(val).absolute?
531
-
532
- !val.match?(%r{^\.\.[/\\]})
533
- end
534
-
535
- private
536
-
537
535
  def append_pull(opts, list, flag = nil)
538
536
  append_submodules flag
539
537
  opts.each do |opt|
@@ -551,7 +549,7 @@ module Squared
551
549
  end
552
550
 
553
551
  def append_pathspec(files = [], expect: false, pass: false)
554
- if files.empty? && (val = option('pathspec'))
552
+ if files.empty? && (val = git_option('pathspec'))
555
553
  files = split_escape(val)
556
554
  end
557
555
  files = source_path(files, pass: pass)
@@ -567,30 +565,30 @@ module Squared
567
565
  end
568
566
 
569
567
  def append_head
570
- @session << (option('head') || option('tree-ish'))
568
+ @session << (git_option('head') || git_option('tree-ish'))
571
569
  end
572
570
 
573
571
  def append_ours
574
- if option('ours')
572
+ if git_option('ours')
575
573
  @session << '--ours'
576
- elsif option('theirs')
574
+ elsif git_option('theirs')
577
575
  @session << '--theirs'
578
576
  end
579
577
  end
580
578
 
581
579
  def append_submodules(flag = nil)
582
- if option('recurse-submodules', equals: '0')
580
+ if git_option('recurse-submodules', equals: '0')
583
581
  @session << '--no-recurse-submodules'
584
- elsif flag == :submodules || option('recurse-submodules')
582
+ elsif flag == :submodules || git_option('recurse-submodules')
585
583
  @session << '--recurse-submodules'
586
584
  end
587
585
  end
588
586
 
589
587
  def append_option(list)
590
- list.each { |val| @session << "--#{val}" if option(val) }
588
+ list.each { |val| @session << "--#{val}" if git_option(val) }
591
589
  end
592
590
 
593
- def option(*args, equals: nil, zero: true)
591
+ def git_option(*args, equals: nil, zero: true)
594
592
  for val in args
595
593
  break if (ret = ENV["GIT_#{val.gsub(/\W/, '_').upcase}"])
596
594
  end
@@ -606,11 +604,13 @@ module Squared
606
604
  end
607
605
 
608
606
  def gitdir
609
- @gitdir ||= base_path('.git')
607
+ base_path('.git')
610
608
  end
611
609
 
612
- def invoked_sync?(action, flag = nil)
613
- !flag.nil? || super(action)
610
+ def source_path?(val)
611
+ return val.to_s.start_with?(File.join(path, '').to_s) if Pathname.new(val).absolute?
612
+
613
+ !val.match?(%r{^\.\.[/\\]})
614
614
  end
615
615
 
616
616
  def push?
@@ -32,24 +32,33 @@ module Squared
32
32
 
33
33
  attr_reader :package
34
34
 
35
- def initialize(*, **kwargs)
35
+ def initialize(*, script: nil, **kwargs)
36
36
  super
37
37
  initialize_script(Node.ref, **kwargs)
38
- if (opts = env('BUILD', strict: true))
39
- raise_error("BUILD_#{@name.upcase}", opts) if @output[0].is_a?(::Array)
40
- @output[1] = opts
41
- else
42
- @output[1] = (@script && @script[:run]) || @workspace.script
43
- end
44
38
  @dev = kwargs[:dev]
45
39
  @prod = kwargs[:prod]
46
40
  @pm = {}
47
41
  @package = base_path('package.json')
42
+ return if @output[0] == false
43
+
44
+ if @output[0].nil?
45
+ val, ext = @workspace.script(Node.ref, @group)
46
+ apply_script val
47
+ unless ext
48
+ if script
49
+ apply_script script
50
+ elsif (val = @script && @script[:run])
51
+ @output[0] = val
52
+ @output[1] = nil
53
+ end
54
+ end
55
+ end
56
+ @output[@output[0] || val.include?(' ') ? 0 : 1] = val if (val = env('BUILD', strict: true))
48
57
  end
49
58
 
50
59
  def populate(*)
51
60
  super
52
- return unless outdated? && !@exclude.include?(Node.ref)
61
+ return unless outdated? && ref?(Node.ref)
53
62
 
54
63
  namespace name do
55
64
  @@tasks[Node.ref].each do |action, flags|
@@ -70,10 +79,10 @@ module Squared
70
79
  when :install
71
80
  desc format_desc(action, flag)
72
81
  task flag do
73
- depend(flag, override: true)
82
+ depend(flag)
74
83
  end
75
84
  when :outdated
76
- desc format_desc(action, flag, %w[prune interactive dry-run], req: 'opts?')
85
+ desc format_desc(action, flag, %w[prune interactive dry-run], arg: 'opts?')
77
86
  task flag, [:opts] do |_, args|
78
87
  outdated(flag, opts: args.to_a)
79
88
  end
@@ -95,7 +104,7 @@ module Squared
95
104
  into = @copy[:into] if @copy.key?(:into)
96
105
  also = @copy[:also] if @copy.key?(:also)
97
106
  end
98
- items = [project == workspace.main ? nil : workspace.home].concat(as_a(also))
107
+ items = [name == workspace.main ? nil : workspace.home].concat(as_a(also))
99
108
  items.each_with_index do |dir, i|
100
109
  if i == 0
101
110
  next unless dev? & !doc?
@@ -133,8 +142,8 @@ module Squared
133
142
  end
134
143
  end
135
144
 
136
- def depend(flag = nil, override: false)
137
- if @depend && !override
145
+ def depend(flag = nil)
146
+ if @depend && !flag
138
147
  super
139
148
  elsif outdated?
140
149
  frozen = flag == :frozen
@@ -191,7 +200,7 @@ module Squared
191
200
  append_nocolor
192
201
  end
193
202
  append_loglevel
194
- run(sync: invoked_sync?('depend'))
203
+ run(sync: invoked_sync?('depend', flag))
195
204
  end
196
205
  end
197
206
 
@@ -200,7 +209,7 @@ module Squared
200
209
  equ = rev || (prod? ? :patch : :minor)
201
210
  cmd = pnpm? ? 'pnpm outdated' : 'npm outdated'
202
211
  log.info cmd
203
- if store_pwd || invoked_sync?("outdated#{rev ? ":#{rev}" : ''}")
212
+ if store_pwd || invoked_sync?("outdated#{rev && ":#{rev}"}")
204
213
  print_item format_banner("#{cmd}#{opts.include?('dry-run') ? ' --dry-run' : ''}", multiple: true)
205
214
  end
206
215
  data = `#{cmd} --json --loglevel=error`
@@ -300,10 +309,10 @@ module Squared
300
309
  elsif modified == cur
301
310
  'FAIL'
302
311
  elsif d == 1
303
- a = sub_style(a, styles: theme[:active])
312
+ a = sub_style(a, styles: theme[:major])
304
313
  sub_style(c, :green, :bold)
305
314
  else
306
- sub_style(c, :green, :bold, pat: SEM_VER, index: d)
315
+ sub_style(c, :green, pat: SEM_VER, index: d)
307
316
  end
308
317
  puts "#{pad_ord.(i, found)}. #{a}#{b.ljust(col2)}#{c}"
309
318
  end
@@ -433,7 +442,7 @@ module Squared
433
442
  Node.prod? || workspace.prod?(script: @output[1], pat: @prod, **runargs)
434
443
  end
435
444
 
436
- protected
445
+ private
437
446
 
438
447
  def append_loglevel(cmd = @session)
439
448
  return unless (level = env('NODE_LOGLEVEL'))
@@ -466,16 +475,22 @@ module Squared
466
475
  end
467
476
  end
468
477
 
469
- private
470
-
471
478
  def confirm_outdated(rev, pkg, ver)
472
479
  m = ver == :major
473
480
  confirm("Upgrade to #{rev}? #{sub_style("#{pkg} #{ver}", styles: theme[:inline])} [#{m ? 'y/N' : 'Y/n'}] ",
474
481
  default: m ? 'N' : 'Y', timeout: 60)
475
482
  end
476
483
 
484
+ def apply_script(val)
485
+ @output[1] = if val.is_a?(::Array)
486
+ val[Node.prod? ? 1 : 0]
487
+ else
488
+ val
489
+ end
490
+ end
491
+
477
492
  def runargs
478
- { ref: Node.ref, group: group, global: !@script || @script[:run].nil? }
493
+ { ref: Node.ref, group: group, global: @output[0].nil? && !(@script && @script[:run]) }
479
494
  end
480
495
  end
481
496
  end