(command.CommandList
  children: [
    (command.ShFunction
      name: usage
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              words: [
                {<echo>}
                {
                  (DQ <'Usage: '> 
                    (command_sub
                      left_token: <Id.Left_DollarParen '$('>
                      child: (C {<basename>} {($ Id.VSub_Number 0)})
                      right: <Id.Eof_RParen _>
                    ) <' file|device string'>
                  )
                }
              ]
              redirects: [(redir op:<Id.Redir_GreatAnd '>&'> loc:(redir_loc.Fd fd:1) arg:{<2>})]
              more_env: []
              do_fork: T
            )
            (command.ControlFlow token:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'COLUMNS='> name:COLUMNS)
          op: assign_op.Equal
          rhs: 
            {
              (command_sub
                left_token: <Id.Left_DollarParen '$('>
                child: (C {<tput>} {<cols>})
                right: <Id.Eof_RParen _>
              )
            }
          spids: [75]
        )
      ]
      redirects: []
    )
    (command.ShFunction
      name: progress
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'DONE='> name:DONE)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Slash
                            left: 
                              (arith_expr.Binary
                                op_id: Id.Arith_Star
                                left: 
                                  (arith_expr.Binary
                                    op_id: Id.Arith_Minus
                                    left: {($ Id.VSub_DollarName COLUMNS)}
                                    right: {<Id.Lit_Digits 2>}
                                  )
                                right: {($ Id.VSub_Number 1)}
                              )
                            right: {<Id.Lit_Digits 100>}
                          )
                      )
                    }
                  spids: [93]
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'TODO='> name:TODO)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Minus
                            left: 
                              (arith_expr.Binary
                                op_id: Id.Arith_Minus
                                left: {($ Id.VSub_DollarName COLUMNS)}
                                right: {<Id.Lit_Digits 2>}
                              )
                            right: {($ Id.VSub_DollarName DONE)}
                          )
                      )
                    }
                  spids: [112]
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'DONE='> name:DONE)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<printf>} {(DQ <'%'> (${ Id.VSub_Name DONE) <s>)})
                              (C {<tr>} {(SQ <' '>)} {<Id.Lit_Equals '='>})
                            ]
                            negated: F
                            stderr_indices: []
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                  spids: [123]
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'TODO='> name:TODO)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<printf>} {(DQ <'%'> (${ Id.VSub_Name TODO) <s>)})
                              (C {<tr>} {(SQ <' '>)} {<->})
                            ]
                            negated: F
                            stderr_indices: []
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                  spids: [147]
                )
              ]
              redirects: []
            )
            (command.Simple
              words: [
                {<printf>}
                {
                  (DQ <'['> ($ Id.VSub_DollarName DONE) ($ Id.VSub_DollarName TODO) <']'> 
                    <Id.Lit_BadBackslash '\\'> <r>
                  )
                }
              ]
              redirects: [(redir op:<Id.Redir_Great '>'> loc:(redir_loc.Fd fd:1) arg:{<'/dev/tty'>})]
              more_env: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name: print
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'CLEAR='> name:CLEAR)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: (C {<printf>} {(DQ <'%'> (${ Id.VSub_Name COLUMNS) <s>)})
                        right: <Id.Eof_RParen _>
                      )
                    }
                  spids: [199]
                )
              ]
              redirects: []
            )
            (C {<printf>} {(DQ ($ Id.VSub_DollarName CLEAR) <Id.Lit_BadBackslash '\\'> <r>)})
            (C {<echo>} {(DQ ($ Id.VSub_At '@'))})
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {<Id.Lit_LBracket '['>} {($ Id.VSub_Pound '#')} {<-ne>} {<2>} {<Id.Lit_RBracket ']'>})
        (C {<usage>})
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'DISK='> name:DISK)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_Number 1))}
          spids: [245]
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'STRING='> name:STRING)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_Number 2))}
          spids: [250]
        )
      ]
      redirects: []
    )
    (C {<export>} {<Id.Lit_VarLike 'LANG='> <C>})
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'CHUNK_SIZE='> name:CHUNK_SIZE)
          op: assign_op.Equal
          rhs: 
            {
              (word_part.ArithSub
                anode: 
                  (arith_expr.Binary
                    op_id: Id.Arith_Star
                    left: 
                      (arith_expr.Binary
                        op_id: Id.Arith_Star
                        left: {<Id.Lit_Digits 8>}
                        right: {<Id.Lit_Digits 1024>}
                      )
                    right: {<Id.Lit_Digits 1024>}
                  )
              )
            }
          spids: [280]
        )
      ]
      redirects: []
    )
    (command.If
      arms: [
        (if_arm
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (C {<Id.Lit_LBracket '['>} {<-b>} {(DQ ($ Id.VSub_DollarName DISK))} 
                      {<Id.Lit_RBracket ']'>}
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          action: [
            (command.AndOr
              ops: [Id.Op_DPipe]
              children: [
                (command.ShAssignment
                  pairs: [
                    (assign_pair
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'SIZE='> name:SIZE)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (command_sub
                            left_token: <Id.Left_DollarParen '$('>
                            child: 
                              (C {<'/sbin/blockdev'>} {<--getsize64>} {($ Id.VSub_DollarName DISK)})
                            right: <Id.Eof_RParen _>
                          )
                        }
                      spids: [306]
                    )
                  ]
                  redirects: []
                )
                (command.ControlFlow
                  token: <Id.ControlFlow_Exit exit>
                  arg_word: {($ Id.VSub_QMark '?')}
                )
              ]
            )
          ]
          spids: [290 303]
        )
      ]
      else_action: [
        (command.AndOr
          ops: [Id.Op_DPipe]
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'SIZE='> name:SIZE)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (C {<stat>} {<--format>} {<Id.Lit_Other '%'> <s>} 
                            {(DQ ($ Id.VSub_DollarName DISK))}
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                  spids: [327]
                )
              ]
              redirects: []
            )
            (command.ControlFlow
              token: <Id.ControlFlow_Exit exit>
              arg_word: {($ Id.VSub_QMark '?')}
            )
          ]
        )
      ]
      redirects: []
    )
    (command.AndOr
      ops: [Id.Op_DAmp]
      children: [
        (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName SIZE)} {<-eq>} {<0>} {<Id.Lit_RBracket ']'>})
        (command.ControlFlow token:<Id.ControlFlow_Exit exit>)
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'CHUNKS='> name:CHUNKS)
          op: assign_op.Equal
          rhs: 
            {
              (word_part.ArithSub
                anode: 
                  (arith_expr.Binary
                    op_id: Id.Arith_Slash
                    left: 
                      (arith_expr.Binary
                        op_id: Id.Arith_Minus
                        left: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Plus
                            left: {($ Id.VSub_DollarName SIZE)}
                            right: {($ Id.VSub_DollarName CHUNK_SIZE)}
                          )
                        right: {<Id.Lit_Digits 1>}
                      )
                    right: {($ Id.VSub_DollarName CHUNK_SIZE)}
                  )
              )
            }
          spids: [363]
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> name:i)
          op: assign_op.Equal
          rhs: {<0>}
          spids: [378]
        )
      ]
      redirects: []
    )
    (command.WhileUntil
      keyword: <Id.KW_While while>
      cond: 
        (condition.Shell
          commands: [(command.Sentence child:(C {<true>}) terminator:<Id.Op_Semi _>)]
        )
      body: 
        (command.DoGroup
          children: [
            (C {<progress>} 
              {
                (word_part.ArithSub
                  anode: 
                    (arith_expr.Binary
                      op_id: Id.Arith_Slash
                      left: 
                        (arith_expr.Binary
                          op_id: Id.Arith_Star
                          left: {($ Id.VSub_DollarName i)}
                          right: {<Id.Lit_Digits 100>}
                        )
                      right: {($ Id.VSub_DollarName CHUNKS)}
                    )
                )
              }
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {(DQ ($ Id.VSub_DollarName i))} {<-ge>} 
                  {(DQ ($ Id.VSub_DollarName CHUNKS))} {<Id.Lit_RBracket ']'>}
                )
                (command.ControlFlow token:<Id.ControlFlow_Break break>)
              ]
            )
            (command.Pipeline
              children: [
                (command.Simple
                  words: [
                    {<dd>}
                    {<Id.Lit_VarLike 'if='> ($ Id.VSub_DollarName DISK)}
                    {<Id.Lit_VarLike 'iflag='> <direct>}
                    {<Id.Lit_VarLike 'conv='> <noerror>}
                    {<Id.Lit_VarLike 'bs='> ($ Id.VSub_DollarName CHUNK_SIZE)}
                    {<Id.Lit_VarLike 'count='> <1>}
                    {<Id.Lit_VarLike 'skip='> ($ Id.VSub_DollarName i)}
                  ]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '2>'>
                      loc: (redir_loc.Fd fd:2)
                      arg: {<'/dev/null'>}
                    )
                  ]
                  more_env: []
                  do_fork: T
                )
                (command.Simple
                  words: [
                    {<grep>}
                    {<--binary-files> <Id.Lit_Equals '='> <text>}
                    {<-U>}
                    {<-F>}
                    {(DQ ($ Id.VSub_DollarName STRING))}
                  ]
                  redirects: [
                    (redir
                      op: <Id.Redir_Great '>'>
                      loc: (redir_loc.Fd fd:1)
                      arg: {<'/dev/null'>}
                    )
                  ]
                  more_env: []
                  do_fork: T
                )
              ]
              negated: F
              stderr_indices: []
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'status='> name:status)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (C {<echo>} 
                            {
                              (braced_var_sub
                                left: <Id.Left_DollarBrace '${'>
                                token: <Id.VSub_Name PIPESTATUS>
                                var_name: PIPESTATUS
                                bracket_op: (bracket_op.WholeArray op_id:Id.Lit_At)
                                right: <Id.Right_DollarBrace '}'>
                              )
                            }
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                  spids: [472]
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'dd_status='> name:dd_status)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<echo>} {($ Id.VSub_DollarName status)})
                              (C {<cut>} {<-f1>} {<-d>} {(SQ <' '>)})
                            ]
                            negated: F
                            stderr_indices: []
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                  spids: [485]
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 're_status='> name:re_status)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (command_sub
                        left_token: <Id.Left_DollarParen '$('>
                        child: 
                          (command.Pipeline
                            children: [
                              (C {<echo>} {($ Id.VSub_DollarName status)})
                              (C {<cut>} {<-f2>} {<-d>} {(SQ <' '>)})
                            ]
                            negated: F
                            stderr_indices: []
                          )
                        right: <Id.Eof_RParen _>
                      )
                    }
                  spids: [505]
                )
              ]
              redirects: []
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName dd_status)} {<-ne>} {<0>} 
                  {<Id.Lit_RBracket ']'>}
                )
                (BraceGroup
                  left: <Id.Lit_LBrace '{'>
                  children: [
                    (command.Sentence
                      child: 
                        (command.Simple
                          words: [{<echo>} {(DQ <'dd error'>)}]
                          redirects: [
                            (redir
                              op: <Id.Redir_GreatAnd '>&'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<2>}
                            )
                          ]
                          more_env: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Sentence
                      child: 
                        (command.ControlFlow
                          token: <Id.ControlFlow_Exit exit>
                          arg_word: {($ Id.VSub_DollarName dd_status)}
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  redirects: []
                  right: <Id.Lit_RBrace '}'>
                )
              ]
            )
            (command.AndOr
              ops: [Id.Op_DAmp]
              children: [
                (C {<Id.Lit_LBracket '['>} {($ Id.VSub_DollarName re_status)} {<-eq>} {<0>} 
                  {<Id.Lit_RBracket ']'>}
                )
                (BraceGroup
                  left: <Id.Lit_LBrace '{'>
                  children: [
                    (command.Sentence
                      child: 
                        (C {<print>} 
                          {
                            (DQ <'dd if='> ($ Id.VSub_DollarName DISK) <' iflag=direct bs='> 
                              ($ Id.VSub_DollarName CHUNK_SIZE) <' count=1 skip='> ($ Id.VSub_DollarName i) <' > disk_grep.'> ($ Id.VSub_DollarName i)
                            )
                          }
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  redirects: []
                  right: <Id.Lit_RBrace '}'>
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'i='> name:i)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (word_part.ArithSub
                        anode: 
                          (arith_expr.Binary
                            op_id: Id.Arith_Plus
                            left: {($ Id.VSub_DollarName i)}
                            right: {<Id.Lit_Digits 1>}
                          )
                      )
                    }
                  spids: [588]
                )
              ]
              redirects: []
            )
          ]
        )
      redirects: []
    )
    (C {<echo>})
  ]
)