(command.If
  arms: [
    (if_arm
      cond: [
        (command.Sentence
          child: 
            (command.DBracket
              expr: (bool_expr.Unary op_id:Id.BoolUnary_z child:{(DQ ($ Id.VSub_DollarName '$VBM'))})
            )
          terminator: (Token id:Id.Op_Semi val:';' span_id:25)
        )
      ]
      action: [
        (command.If
          arms: [
            (if_arm
              cond: [
                (command.Sentence
                  child: 
                    (command.Pipeline
                      children: [
                        (command.Simple
                          words: [{(command)} {(-v)} {(VBoxManage)}]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:41)
                              fd: -1
                              arg_word: {(/dev/null)}
                            )
                          ]
                        )
                      ]
                      negated: T
                    )
                  terminator: (Token id:Id.Op_Semi val:';' span_id:44)
                )
              ]
              action: [
                (command.Simple
                  words: [{(echo)} {(DQ ('VBoxManage not found!'))}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:55)
                      fd: -1
                      arg_word: {(2)}
                    )
                  ]
                )
                (command.Simple
                  words: [
                    {(echo)}
                    {
                      (DQ 
                        (
'  Please ensure VirtualBox is installed and VBoxManage is on your system PATH.'
                        )
                      )
                    }
                  ]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:65)
                      fd: -1
                      arg_word: {(2)}
                    )
                  ]
                )
                (command.ControlFlow
                  token: (Token id:Id.ControlFlow_Exit val:exit span_id:69)
                  arg_word: {(1)}
                )
              ]
              spids: [31 46]
            )
          ]
        )
        (command.ShFunction
          name: check_version
          body: 
            (command.BraceGroup
              children: [
                (C {(local)} {(Id.Lit_VarLike 'MIN_MAJOR=') (4)})
                (C {(local)} {(Id.Lit_VarLike 'MIN_MINOR=') (3)})
                (C {(local)} {(Id.Lit_VarLike 'IFS=') (SQ (Token id:Id.Lit_Chars val:. span_id:102))})
                (C {(local)} 
                  {(Id.Lit_VarLike 'version=') 
                    (DQ 
                      (command_sub
                        left_token: (Token id:Id.Left_DollarParen val:'$(' span_id:110)
                        command_list: 
                          (command.CommandList
                            children: [(C {(VBoxManage)} {(--version)})]
                          )
                      )
                    )
                  }
                )
                (C {(local)} {(version_array)})
                (command.Simple
                  words: [{(read)} {(-a)} {(version_array)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_TLess val:'<<<' span_id:129)
                      fd: -1
                      arg_word: {(DQ ($ Id.VSub_DollarName '$version'))}
                    )
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: [
                        (command.Pipeline
                          children: [
                            (command.DBracket
                              expr: 
                                (bool_expr.LogicalOr
                                  left: 
                                    (bool_expr.Binary
                                      op_id: Id.BoolBinary_gt
                                      left: 
                                        {
                                          (DQ 
                                            (braced_var_sub
                                              token: 
                                                (Token
                                                  id: Id.VSub_Name
                                                  val: version_array
                                                  span_id: 145
                                                )
                                              bracket_op: 
                                                (bracket_op.ArrayIndex
                                                  expr: (arith_expr.ArithWord w:{(Id.Lit_Digits 0)})
                                                )
                                            )
                                          )
                                        }
                                      right: {(DQ ($ Id.VSub_DollarName '$MIN_MAJOR'))}
                                    )
                                  right: 
                                    (bool_expr.LogicalAnd
                                      left: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_ge
                                          left: 
                                            {
                                              (DQ 
                                                (braced_var_sub
                                                  token: 
                                                    (Token
                                                      id: Id.VSub_Name
                                                      val: version_array
                                                      span_id: 164
                                                    )
                                                  bracket_op: 
                                                    (bracket_op.ArrayIndex
                                                      expr: 
                                                        (arith_expr.ArithWord
                                                          w: {(Id.Lit_Digits 0)}
                                                        )
                                                    )
                                                )
                                              )
                                            }
                                          right: {(DQ ($ Id.VSub_DollarName '$MIN_MAJOR'))}
                                        )
                                      right: 
                                        (bool_expr.Binary
                                          op_id: Id.BoolBinary_ge
                                          left: 
                                            {
                                              (DQ 
                                                (braced_var_sub
                                                  token: 
                                                    (Token
                                                      id: Id.VSub_Name
                                                      val: version_array
                                                      span_id: 183
                                                    )
                                                  bracket_op: 
                                                    (bracket_op.ArrayIndex
                                                      expr: 
                                                        (arith_expr.ArithWord
                                                          w: {(Id.Lit_Digits 1)}
                                                        )
                                                    )
                                                )
                                              )
                                            }
                                          right: {(DQ ($ Id.VSub_DollarName '$MIN_MINOR'))}
                                        )
                                    )
                                )
                            )
                          ]
                          negated: T
                        )
                      ]
                      action: [
                        (command.Simple
                          words: [
                            {(echo)}
                            {
                              (DQ ('ERROR: VirtualBox ') ($ Id.VSub_DollarName '$version') 
                                (' is less than ') ($ Id.VSub_DollarName '$MIN_MAJOR') (.) ($ Id.VSub_DollarName '$MIN_MINOR') ('.x!')
                              )
                            }
                          ]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:214)
                              fd: -1
                              arg_word: {(2)}
                            )
                          ]
                        )
                        (command.Simple
                          words: [
                            {(echo)}
                            {
                              (DQ ('  Only VirtualBox >= ') ($ Id.VSub_DollarName '$MIN_MAJOR') (.) 
                                ($ Id.VSub_DollarName '$MIN_MINOR') ('.x is officially supported.')
                              )
                            }
                          ]
                          redirects: [
                            (redir.Redir
                              op: (Token id:Id.Redir_GreatAnd val:'>&' span_id:228)
                              fd: -1
                              arg_word: {(2)}
                            )
                          ]
                        )
                        (command.ControlFlow
                          token: (Token id:Id.ControlFlow_Exit val:exit span_id:232)
                          arg_word: {(1)}
                        )
                      ]
                      spids: [137 199]
                    )
                  ]
                )
              ]
            )
        )
        (C {(check_version)})
        (C {(unset)} {(-f)} {(check_version)})
        (C {(export)} {(Id.Lit_VarLike 'VBM=') (VBoxManage)})
      ]
      spids: [14 27]
    )
  ]
)