(command.CommandList
  children: [
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (C {<test>} {<Id.KW_Bang '!'>} {<-e>} {<src/google/protobuf/stubs/common.h>})
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})
                (redir.HereDoc
                  op: <Id.Redir_DLess '<<'>
                  fd: -1
                  here_begin: {<__EOF__>}
                  here_end_span_id: 58
                  stdin_parts: [
                    <
'Could not find source code.  Make sure you are running this script from the\n'
                    >
                    <'root of the distribution tree.\n'>
                  ]
                )
              ]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [32 43]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (C {<test>} {<Id.KW_Bang '!'>} {<-e>} {<src/Makefile>})
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (command.Simple
              words: [{<cat>}]
              redirects: [
                (redir.Redir op:<Id.Redir_GreatAnd '>&'> fd:-1 arg_word:{<2>})
                (redir.HereDoc
                  op: <Id.Redir_DLess '<<'>
                  fd: -1
                  here_begin: {<__EOF__>}
                  here_end_span_id: 93
                  stdin_parts: [
                    <'Could not find src/Makefile.  You must run ./configure (and perhaps\n'>
                    <'./autogen.sh) first.\n'>
                  ]
                )
              ]
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [67 78]
        )
      ]
    )
    (C {<cd>} {<src>})
    (C {<declare>} {<-a>} 
      {<Id.Lit_VarLike 'RUNTIME_PROTO_FILES='> 
        (sh_array_literal
          left: <Id.Op_LParen _>
          words: [
            {<google/protobuf/any.proto>}
            {<google/protobuf/api.proto>}
            {<google/protobuf/descriptor.proto>}
            {<google/protobuf/duration.proto>}
            {<google/protobuf/empty.proto>}
            {<google/protobuf/field_mask.proto>}
            {<google/protobuf/source_context.proto>}
            {<google/protobuf/struct.proto>}
            {<google/protobuf/timestamp.proto>}
            {<google/protobuf/type.proto>}
            {<google/protobuf/wrappers.proto>}
          ]
        )
      }
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:CORE_PROTO_IS_CORRECT)
          op: assign_op.Equal
          rhs: {<0>}
          spids: [159]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:PROCESS_ROUND)
          op: assign_op.Equal
          rhs: {<1>}
          spids: [162]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:TMP)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                command_list: (command.CommandList children:[(C {<mktemp>} {<-d>})])
              )
            }
          spids: [165]
        )
      ]
    )
    (C {<echo>} {(DQ <'Updating descriptor protos...'>)})
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: [
        (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$CORE_PROTO_IS_CORRECT')} {<-ne>} {<1>} 
          {<Id.Lit_RBracket ']'>}
        )
      ]
      body: 
        (command.DoGroup
          children: [
            (C {<echo>} {(DQ <'Round '> ($ Id.VSub_DollarName '$PROCESS_ROUND'))})
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:CORE_PROTO_IS_CORRECT)
                  op: assign_op.Equal
                  rhs: {<1>}
                  spids: [201]
                )
              ]
            )
            (C {<make>} {($ Id.VSub_At '$@')} {<protoc>})
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: (C {<test>} {($ Id.VSub_QMark '$?')} {<-ne>} {<0>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  action: [
                    (C {<echo>} {(DQ <'Failed to build protoc.'>)})
                    (command.ControlFlow
                      token: <Id.ControlFlow_Exit exit>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [213 224]
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<./protoc>} 
                  {<--cpp_out> <Id.Lit_Equals '='> <Id.Lit_VarLike 'dllexport_decl='> 
                    <LIBPROTOBUF_EXPORT> <Id.Lit_Other ':'> ($ Id.VSub_DollarName '$TMP')
                  } 
                  {
                    (braced_var_sub
                      token: <Id.VSub_Name RUNTIME_PROTO_FILES>
                      bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                    )
                  }
                )
                (C {<./protoc>} 
                  {<--cpp_out> <Id.Lit_Equals '='> <Id.Lit_VarLike 'dllexport_decl='> 
                    <LIBPROTOC_EXPORT> <Id.Lit_Other ':'> ($ Id.VSub_DollarName '$TMP')
                  } {<google/protobuf/compiler/plugin.proto>}
                )
              ]
            )
            (command.ForEach
              iter_name: PROTO_FILE
              iter_words: [
                {
                  (braced_var_sub
                    token: <Id.VSub_Name RUNTIME_PROTO_FILES>
                    bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                  )
                }
              ]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:BASE_NAME)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (braced_var_sub
                                token: <Id.VSub_Name PROTO_FILE>
                                suffix_op: (suffix_op.Unary op_id:Id.VOp1_Percent arg_word:{<'.*'>})
                              )
                            }
                          spids: [293]
                        )
                      ]
                    )
                    (command.Simple
                      words: [
                        {<diff>}
                        {(${ Id.VSub_Name BASE_NAME) <.pb.h>}
                        {($ Id.VSub_DollarName '$TMP') </> (${ Id.VSub_Name BASE_NAME) <.pb.h>}
                      ]
                      redirects: [(redir.Redir op:<Id.Redir_Great '>'> fd:-1 arg_word:{</dev/null>})]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: (C {<test>} {($ Id.VSub_QMark '$?')} {<-ne>} {<0>})
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:CORE_PROTO_IS_CORRECT)
                                  op: assign_op.Equal
                                  rhs: {<0>}
                                  spids: [334]
                                )
                              ]
                            )
                          ]
                          spids: [320 331]
                        )
                      ]
                    )
                    (command.Simple
                      words: [
                        {<diff>}
                        {(${ Id.VSub_Name BASE_NAME) <.pb.cc>}
                        {($ Id.VSub_DollarName '$TMP') </> (${ Id.VSub_Name BASE_NAME) <.pb.cc>}
                      ]
                      redirects: [(redir.Redir op:<Id.Redir_Great '>'> fd:-1 arg_word:{</dev/null>})]
                    )
                    (command.If
                      arms: [
                        (if_arm
                          cond: [
                            (command.Sentence
                              child: (C {<test>} {($ Id.VSub_QMark '$?')} {<-ne>} {<0>})
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                          action: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:CORE_PROTO_IS_CORRECT)
                                  op: assign_op.Equal
                                  rhs: {<0>}
                                  spids: [374]
                                )
                              ]
                            )
                          ]
                          spids: [360 371]
                        )
                      ]
                    )
                  ]
                )
            )
            (command.Simple
              words: [
                {<diff>}
                {<google/protobuf/compiler/plugin.pb.h>}
                {($ Id.VSub_DollarName '$TMP') </google/protobuf/compiler/plugin.pb.h>}
              ]
              redirects: [(redir.Redir op:<Id.Redir_Great '>'> fd:-1 arg_word:{</dev/null>})]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: (C {<test>} {($ Id.VSub_QMark '$?')} {<-ne>} {<0>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:CORE_PROTO_IS_CORRECT)
                          op: assign_op.Equal
                          rhs: {<0>}
                          spids: [411]
                        )
                      ]
                    )
                  ]
                  spids: [397 408]
                )
              ]
            )
            (command.Simple
              words: [
                {<diff>}
                {<google/protobuf/compiler/plugin.pb.cc>}
                {($ Id.VSub_DollarName '$TMP') </google/protobuf/compiler/plugin.pb.cc>}
              ]
              redirects: [(redir.Redir op:<Id.Redir_Great '>'> fd:-1 arg_word:{</dev/null>})]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: (C {<test>} {($ Id.VSub_QMark '$?')} {<-ne>} {<0>})
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  action: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:CORE_PROTO_IS_CORRECT)
                          op: assign_op.Equal
                          rhs: {<0>}
                          spids: [444]
                        )
                      ]
                    )
                  ]
                  spids: [430 441]
                )
              ]
            )
            (command.If
              arms: [
                (if_arm
                  cond: [
                    (command.Sentence
                      child: 
                        (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName '$CORE_PROTO_IS_CORRECT')} 
                          {<-ne>} {<1>} {<Id.Lit_RBracket ']'>}
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  action: [
                    (command.ForEach
                      iter_name: PROTO_FILE
                      iter_words: [
                        {
                          (braced_var_sub
                            token: <Id.VSub_Name RUNTIME_PROTO_FILES>
                            bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                          )
                        }
                      ]
                      do_arg_iter: F
                      body: 
                        (command.DoGroup
                          children: [
                            (command.ShAssignment
                              pairs: [
                                (assign_pair
                                  lhs: (sh_lhs_expr.Name name:BASE_NAME)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (braced_var_sub
                                        token: <Id.VSub_Name PROTO_FILE>
                                        suffix_op: 
                                          (suffix_op.Unary
                                            op_id: Id.VOp1_Percent
                                            arg_word: {<'.*'>}
                                          )
                                      )
                                    }
                                  spids: [493]
                                )
                              ]
                            )
                            (C {<mv>} 
                              {($ Id.VSub_DollarName '$TMP') </> (${ Id.VSub_Name BASE_NAME) <.pb.h>} {(${ Id.VSub_Name BASE_NAME) <.pb.h>}
                            )
                            (C {<mv>} 
                              {($ Id.VSub_DollarName '$TMP') </> (${ Id.VSub_Name BASE_NAME) <.pb.cc>} {(${ Id.VSub_Name BASE_NAME) <.pb.cc>}
                            )
                          ]
                        )
                    )
                    (C {<mv>} 
                      {($ Id.VSub_DollarName '$TMP') </google/protobuf/compiler/plugin.pb.> 
                        <Id.Lit_Star '*'>
                      } {<google/protobuf/compiler/>}
                    )
                  ]
                  spids: [460 473]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:PROCESS_ROUND)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Plus
                            left: (arith_expr.VarRef token:<Id.Lit_ArithVarLike PROCESS_ROUND>)
                            right: (arith_expr.ArithWord w:{<Id.Lit_Digits 1>})
                          )
                      )
                    }
                  spids: [547]
                )
              ]
            )
          ]
        )
    )
    (C {<cd>} {<..>})
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (C {<test>} {<-x>} {<objectivec/generate_well_known_types.sh>})
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (C {<echo>} {(DQ <'Generating messages for objc.'>)})
            (C {<objectivec/generate_well_known_types.sh>} {($ Id.VSub_At '$@')})
          ]
          spids: [564 573]
        )
      ]
    )
    (command.If
      arms: [
        (if_arm
          cond: [
            (command.Sentence
              child: (C {<test>} {<-x>} {<csharp/generate_protos.sh>})
              terminator: <Id.Op_Semi _>
            )
          ]
          action: [
            (C {<echo>} {(DQ <'Generating messages for C#.'>)})
            (C {<csharp/generate_protos.sh>} {($ Id.VSub_At '$@')})
          ]
          spids: [590 599]
        )
      ]
    )
  ]
)