(command.CommandList
  children: [
    (command.Simple blame_tok:<set> more_env:[] words:[{<set>} {<-u>}] redirects:[] do_fork:T)
    (command.ShFunction
      name_tok: <die>
      name: die
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {($ Id.VSub_Pound '#')}
                    {<-gt>}
                    {<0>}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.Simple
                  blame_tok: <echo>
                  more_env: []
                  words: [{<echo>} {(DQ <'error: '> ($ Id.VSub_Star '*'))}]
                  redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
                  do_fork: T
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'BASE_DIR='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'BASE_DIR='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'BASE_DIR='> name:BASE_DIR)
          op: assign_op.Equal
          rhs: 
            {
              (CommandSub
                left_token: <Id.Left_DollarParen '$('>
                child: 
                  (command.Simple
                    blame_tok: <dirname>
                    more_env: []
                    words: [{<dirname>} {(DQ ($ Id.VSub_Number 0))}]
                    redirects: []
                    do_fork: T
                  )
                right: <Id.Eof_RParen _>
              )
            }
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'LIB_DIR='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'LIB_DIR='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'LIB_DIR='> name:LIB_DIR)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name BASE_DIR) <'/lib'>)}
        )
      ]
      redirects: []
    )
    (command.AndOr
      children: [
        (command.Simple
          blame_tok: <.>
          more_env: []
          words: [{<.>} {(DQ (${ Id.VSub_Name LIB_DIR) <'/shflags'>)}]
          redirects: []
          do_fork: T
        )
        (command.Simple
          blame_tok: <die>
          more_env: []
          words: [{<die>} {(SQ <'unable to load shflags library'>)}]
          redirects: []
          do_fork: T
        )
      ]
      ops: [<Id.Op_DPipe _>]
    )
    (command.AndOr
      children: [
        (command.Simple
          blame_tok: <.>
          more_env: []
          words: [{<.>} {(DQ (${ Id.VSub_Name LIB_DIR) <'/shlib'>)}]
          redirects: []
          do_fork: T
        )
        (command.Simple
          blame_tok: <die>
          more_env: []
          words: [{<die>} {(SQ <'unable to load shlib library'>)}]
          redirects: []
          do_fork: T
        )
      ]
      ops: [<Id.Op_DPipe _>]
    )
    (command.AndOr
      children: [
        (command.Simple
          blame_tok: <.>
          more_env: []
          words: [{<.>} {(DQ (${ Id.VSub_Name LIB_DIR) <'/versions'>)}]
          redirects: []
          do_fork: T
        )
        (command.Simple
          blame_tok: <die>
          more_env: []
          words: [{<die>} {(SQ <'unable to load versions library'>)}]
          redirects: []
          do_fork: T
        )
      ]
      ops: [<Id.Op_DPipe _>]
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'BASE_DIR='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'BASE_DIR='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'BASE_DIR='> name:BASE_DIR)
          op: assign_op.Equal
          rhs: 
            {
              (CommandSub
                left_token: <Id.Left_DollarParen '$('>
                child: 
                  (command.Simple
                    blame_tok: <shlib_relToAbsPath>
                    more_env: []
                    words: [{<shlib_relToAbsPath>} {(DQ (${ Id.VSub_Name BASE_DIR))}]
                    redirects: []
                    do_fork: T
                  )
                right: <Id.Eof_RParen _>
              )
            }
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'os_name='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'os_name='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'os_name='> name:os_name)
          op: assign_op.Equal
          rhs: 
            {
              (CommandSub
                left_token: <Id.Left_DollarParen '$('>
                child: 
                  (command.Pipeline
                    children: [
                      (command.Simple
                        blame_tok: <versions_osName>
                        more_env: []
                        words: [{<versions_osName>}]
                        redirects: []
                        do_fork: T
                      )
                      (command.Simple
                        blame_tok: <sed>
                        more_env: []
                        words: [{<sed>} {(SQ <'s/ /_/g'>)}]
                        redirects: []
                        do_fork: T
                      )
                    ]
                    ops: [<Id.Op_Pipe _>]
                  )
                right: <Id.Eof_RParen _>
              )
            }
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'os_version='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'os_version='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'os_version='> name:os_version)
          op: assign_op.Equal
          rhs: 
            {
              (CommandSub
                left_token: <Id.Left_DollarParen '$('>
                child: 
                  (command.Simple
                    blame_tok: <versions_osVersion>
                    more_env: []
                    words: [{<versions_osVersion>}]
                    redirects: []
                    do_fork: T
                  )
                right: <Id.Eof_RParen _>
              )
            }
        )
      ]
      redirects: []
    )
    (command.Simple
      blame_tok: <DEFINE_boolean>
      more_env: []
      words: [{<DEFINE_boolean>} {<force>} {<false>} {(SQ <'force overwrite'>)} {<f>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <DEFINE_string>
      more_env: []
      words: [{<DEFINE_string>} {<output_dir>} {(DQ (${ Id.VSub_Name TMPDIR))} {(SQ <'output dir'>)} {<d>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <DEFINE_string>
      more_env: []
      words: [
        {<DEFINE_string>}
        {<output_file>}
        {(DQ (${ Id.VSub_Name os_name) <-> (${ Id.VSub_Name os_version) <.txt>)}
        {(SQ <'output file'>)}
        {<o>}
      ]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <DEFINE_string>
      more_env: []
      words: [{<DEFINE_string>} {<runner>} {(SQ <test_runner>)} {(SQ <'unit test runner'>)} {<r>}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <DEFINE_boolean>
      more_env: []
      words: [{<DEFINE_boolean>} {<dry_run>} {<false>} {(DQ <'suppress logging to a file'>)} {<n>}]
      redirects: []
      do_fork: T
    )
    (command.ShFunction
      name_tok: <main>
      name: main
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'output='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'output='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'output='> name:output)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (BracedVarSub
                          left: <Id.Left_DollarBrace '${'>
                          token: <Id.VSub_Name FLAGS_output_dir>
                          var_name: FLAGS_output_dir
                          suffix_op: 
                            (suffix_op.Unary
                              op: <Id.VTest_ColonPlus _>
                              arg_word: {(${ Id.VSub_Name FLAGS_output_dir) <Id.Lit_Slash '/'>}
                            )
                          right: <Id.Right_DollarBrace '}'>
                        ) (${ Id.VSub_Name FLAGS_output_file)
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'output='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'output='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'output='> name:output)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Simple
                            blame_tok: <shlib_relToAbsPath>
                            more_env: []
                            words: [{<shlib_relToAbsPath>} {(DQ (${ Id.VSub_Name output))}]
                            redirects: []
                            do_fork: T
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Simple
                              blame_tok: <Id.Lit_LBracket '['>
                              more_env: []
                              words: [
                                {<Id.Lit_LBracket '['>}
                                {(DQ (${ Id.VSub_Name FLAGS_dry_run))}
                                {<-eq>}
                                {(DQ (${ Id.VSub_Name FLAGS_FALSE))}
                                {<-a>}
                                {<-f>}
                                {(DQ (${ Id.VSub_Name output))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.If
                      if_kw: <Id.KW_If if>
                      arms: [
                        (IfArm
                          keyword: <Id.KW_If if>
                          cond: 
                            (condition.Shell
                              commands: [
                                (command.Sentence
                                  child: 
                                    (command.Simple
                                      blame_tok: <Id.Lit_LBracket '['>
                                      more_env: []
                                      words: [
                                        {<Id.Lit_LBracket '['>}
                                        {(DQ (${ Id.VSub_Name FLAGS_force))}
                                        {<-eq>}
                                        {(DQ (${ Id.VSub_Name FLAGS_TRUE))}
                                        {<Id.Lit_RBracket ']'>}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <rm>
                              more_env: []
                              words: [{<rm>} {<-f>} {(DQ (${ Id.VSub_Name output))}]
                              redirects: []
                              do_fork: T
                            )
                          ]
                          spids: [373 394]
                        )
                      ]
                      else_kw: <Id.KW_Else else>
                      else_action: [
                        (command.Simple
                          blame_tok: <echo>
                          more_env: []
                          words: [{<echo>} {(DQ <'not overwriting \''> (${ Id.VSub_Name output) <'\''>)}]
                          redirects: [
                            (Redir
                              op: <Id.Redir_GreatAnd '>&'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<2>}
                            )
                          ]
                          do_fork: T
                        )
                        (command.ControlFlow
                          keyword: <Id.ControlFlow_Exit exit>
                          arg_word: {(DQ (${ Id.VSub_Name FLAGS_ERROR))}
                        )
                      ]
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [339 370]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Simple
                              blame_tok: <Id.Lit_LBracket '['>
                              more_env: []
                              words: [
                                {<Id.Lit_LBracket '['>}
                                {(DQ (${ Id.VSub_Name FLAGS_dry_run))}
                                {<-eq>}
                                {(DQ (${ Id.VSub_Name FLAGS_FALSE))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <touch>
                          more_env: []
                          words: [{<touch>} {(DQ (${ Id.VSub_Name output))}]
                          redirects: [
                            (Redir
                              op: <Id.Redir_Great '2>'>
                              loc: (redir_loc.Fd fd:2)
                              arg: {<'/dev/null'>}
                            )
                          ]
                          do_fork: T
                        )
                        (command.Simple
                          blame_tok: <die>
                          more_env: []
                          words: [
                            {<die>}
                            {(DQ <'unable to write to \''> (${ Id.VSub_Name output) <'\''>)}
                          ]
                          redirects: []
                          do_fork: T
                        )
                      ]
                      ops: [<Id.Op_DPipe _>]
                    )
                  ]
                  spids: [440 461]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Subshell
              left: <Id.Op_LParen _>
              child: 
                (command.If
                  if_kw: <Id.KW_If if>
                  arms: [
                    (IfArm
                      keyword: <Id.KW_If if>
                      cond: 
                        (condition.Shell
                          commands: [
                            (command.Sentence
                              child: 
                                (command.Simple
                                  blame_tok: <Id.Lit_LBracket '['>
                                  more_env: []
                                  words: [
                                    {<Id.Lit_LBracket '['>}
                                    {(DQ (${ Id.VSub_Name FLAGS_dry_run))}
                                    {<-eq>}
                                    {(DQ (${ Id.VSub_Name FLAGS_FALSE))}
                                    {<Id.Lit_RBracket ']'>}
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                        )
                      then_kw: <Id.KW_Then then>
                      action: [
                        (command.Pipeline
                          children: [
                            (command.Simple
                              blame_tok: <Id.Left_DoubleQuote '"'>
                              more_env: []
                              words: [{(DQ <'./'> (${ Id.VSub_Name FLAGS_runner))}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <tee>
                              more_env: []
                              words: [{<tee>} {(DQ (${ Id.VSub_Name output))}]
                              redirects: []
                              do_fork: T
                            )
                          ]
                          ops: [<Id.Op_Pipe _>]
                        )
                      ]
                      spids: [499 520]
                    )
                  ]
                  else_kw: <Id.KW_Else else>
                  else_action: [
                    (command.Simple
                      blame_tok: <Id.Left_DoubleQuote '"'>
                      more_env: []
                      words: [{(DQ <'./'> (${ Id.VSub_Name FLAGS_runner))}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  fi_kw: <Id.KW_Fi fi>
                  redirects: []
                )
              right: <Id.Right_Subshell _>
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Simple
                              blame_tok: <Id.Lit_LBracket '['>
                              more_env: []
                              words: [
                                {<Id.Lit_LBracket '['>}
                                {(DQ (${ Id.VSub_Name FLAGS_dry_run))}
                                {<-eq>}
                                {(DQ (${ Id.VSub_Name FLAGS_FALSE))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>}]
                      redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {(DQ <'Output written to \''> (${ Id.VSub_Name output) <'\'.'>)}]
                      redirects: [(Redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
                      do_fork: T
                    )
                  ]
                  spids: [558 579]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.AndOr
      children: [
        (command.Simple
          blame_tok: <FLAGS>
          more_env: []
          words: [{<FLAGS>} {(DQ ($ Id.VSub_At '@'))}]
          redirects: []
          do_fork: T
        )
        (command.ControlFlow
          keyword: <Id.ControlFlow_Exit exit>
          arg_word: {($ Id.VSub_QMark '?')}
        )
      ]
      ops: [<Id.Op_DPipe _>]
    )
    (command.AndOr
      children: [
        (command.Simple
          blame_tok: <Id.Lit_LBracket '['>
          more_env: []
          words: [
            {<Id.Lit_LBracket '['>}
            {(DQ (${ Id.VSub_Name FLAGS_help))}
            {<-eq>}
            {(DQ (${ Id.VSub_Name FLAGS_FALSE))}
            {<Id.Lit_RBracket ']'>}
          ]
          redirects: []
          do_fork: T
        )
        (command.ControlFlow keyword:<Id.ControlFlow_Exit exit>)
      ]
      ops: [<Id.Op_DPipe _>]
    )
    (command.Simple
      blame_tok: <eval>
      more_env: []
      words: [{<eval>} {<set>} {<-->} {(DQ (${ Id.VSub_Name FLAGS_ARGV))}]
      redirects: []
      do_fork: T
    )
    (command.Simple
      blame_tok: <main>
      more_env: []
      words: [
        {<main>}
        {
          (DQ 
            (BracedVarSub
              left: <Id.Left_DollarBrace '${'>
              token: <Id.VSub_At '@'>
              var_name: '@'
              suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:(rhs_word__Empty))
              right: <Id.Right_DollarBrace '}'>
            )
          )
        }
      ]
      redirects: []
      do_fork: T
    )
  ]
)