(command.CommandList
  children: [
    (command.ShFunction
      name_tok: <err>
      name: err
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName quietflag))}
                                {<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>}
                        {(${ Id.VSub_Name THISCMD) <Id.Lit_Colon ':'>}
                        {<ERROR> <Id.Lit_Colon ':'>}
                        {($ Id.VSub_Star '*')}
                      ]
                      redirects: [
                        (Redir
                          op: <Id.Redir_GreatAnd '1>&'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<2>}
                        )
                      ]
                      do_fork: T
                    )
                  ]
                  spids: [101 114]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <info>
      name: info
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName quietflag))}
                                {<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>}
                        {(${ Id.VSub_Name THISCMD) <Id.Lit_Colon ':'>}
                        {<INFO> <Id.Lit_Colon ':'>}
                        {($ Id.VSub_Star '*')}
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [154 167]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_nextuid>
      name: get_nextuid
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike '_uid='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_uid='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_uid='> name:_uid)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number 1)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_nextuid='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_nextuid='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_nextuid='> name:_nextuid)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName _uid))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_nextuid='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_nextuid='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_nextuid='> name:_nextuid)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ 
                                (CommandSub
                                  left_token: <Id.Left_Backtick '`'>
                                  child: 
                                    (command.Pipeline
                                      children: [
                                        (command.Simple
                                          blame_tok: <Id.Left_DollarBrace '${'>
                                          more_env: []
                                          words: [{(${ Id.VSub_Name PWCMD)} {<usernext>}]
                                          redirects: []
                                          do_fork: T
                                        )
                                        (command.Simple
                                          blame_tok: <cut>
                                          more_env: []
                                          words: [{<cut>} {<-f1>} {<-d> <Id.Lit_Colon ':'>}]
                                          redirects: []
                                          do_fork: T
                                        )
                                      ]
                                      ops: [<Id.Op_Pipe _>]
                                    )
                                  right: <Id.Backtick_Right '`'>
                                )
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                  ]
                  spids: [222 235]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.WhileUntil
                  keyword: <Id.KW_While while>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Simple
                              blame_tok: <Id.Lit_Colon ':'>
                              more_env: []
                              words: [{<Id.Lit_Colon ':'>}]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  body: 
                    (command.DoGroup
                      left: <Id.KW_Do do>
                      children: [
                        (command.Simple
                          blame_tok: <Id.Left_DollarBrace '${'>
                          more_env: []
                          words: [{(${ Id.VSub_Name PWCMD)} {<usershow>} {($ Id.VSub_DollarName _uid)}]
                          redirects: [
                            (Redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<'/dev/null'>}
                            )
                            (Redir
                              op: <Id.Redir_GreatAnd '2>&'>
                              loc: (redir_loc.Fd fd:2)
                              arg: {<1>}
                            )
                          ]
                          do_fork: T
                        )
                        (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 '['>}
                                            {<Id.KW_Bang '!'>}
                                            {(DQ ($ Id.VSub_QMark '?'))}
                                            {<-eq>}
                                            {<0>}
                                            {<Id.Lit_RBracket ']'>}
                                          ]
                                          redirects: []
                                          do_fork: T
                                        )
                                      terminator: <Id.Op_Semi _>
                                    )
                                  ]
                                )
                              then_kw: <Id.KW_Then then>
                              action: [
                                (command.ShAssignment
                                  left: <Id.Lit_VarLike '_nextuid='>
                                  pairs: [
                                    (AssignPair
                                      left: <Id.Lit_VarLike '_nextuid='>
                                      lhs: 
                                        (sh_lhs_expr.Name
                                          left: <Id.Lit_VarLike '_nextuid='>
                                          name: _nextuid
                                        )
                                      op: assign_op.Equal
                                      rhs: {($ Id.VSub_DollarName _uid)}
                                    )
                                  ]
                                  redirects: []
                                )
                                (command.ControlFlow
                                  keyword: <Id.ControlFlow_Break break>
                                )
                              ]
                              spids: [289 306]
                            )
                          ]
                          else_action: []
                          fi_kw: <Id.KW_Fi fi>
                          redirects: []
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike '_uid='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike '_uid='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_uid='> name:_uid)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (word_part.ArithSub
                                    left: <Id.Left_DollarDParen '$(('>
                                    anode: 
                                      (arith_expr.Binary
                                        op_id: Id.Arith_Plus
                                        left: {($ Id.VSub_DollarName _uid)}
                                        right: {<Id.Lit_Digits 1>}
                                      )
                                    right: <Id.Right_DollarDParen _>
                                  )
                                }
                            )
                          ]
                          redirects: []
                        )
                      ]
                      right: <Id.KW_Done done>
                    )
                  redirects: []
                )
              ]
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {($ Id.VSub_DollarName _nextuid)}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <show_usage>
      name: show_usage
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'usage: '> (${ Id.VSub_Name THISCMD) <' [options]'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  options may include:'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -C\t\tsave to the configuration file only'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -D\t\tdo not attempt to create the home directory'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -E\t\tdisable this account after creation'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -G\t\tadditional groups to add accounts to'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -L\t\tlogin class of the user'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -M\t\tfile permission for home directory'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -N\t\tdo not read configuration file'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -S\t\ta nonexistent shell is not an error'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -d\t\thome directory'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -f\t\tfile from which input will be received'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -g\t\tdefault login group'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -h\t\tdisplay this usage message'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -k\t\tpath to skeleton home directory'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -m\t\tuser welcome message file'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -q\t\tabsolute minimal user feedback'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -s\t\tshell'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -u\t\tuid to start at'>)}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'  -w\t\tpassword type: no, none, yes or random'>)}]
              redirects: []
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <valid_shells>
      name: valid_shells
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike '_prefix='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_prefix='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prefix='> name:_prefix)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.Pipeline
              children: [
                (command.Simple
                  blame_tok: <cat>
                  more_env: []
                  words: [{<cat>} {(${ Id.VSub_Name ETCSHELLS)}]
                  redirects: []
                  do_fork: T
                )
                (command.WhileUntil
                  keyword: <Id.KW_While while>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Simple
                              blame_tok: <read>
                              more_env: []
                              words: [{<read>} {<_path>} {<_junk>}]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  body: 
                    (command.DoGroup
                      left: <Id.KW_Do do>
                      children: [
                        (command.Case
                          case_kw: <Id.KW_Case case>
                          to_match: (case_arg.Word w:{($ Id.VSub_DollarName _path)})
                          arms_start: <Id.KW_In in>
                          arms: [
                            (CaseArm
                              left: <Id.Lit_EscapedChar '\\#'>
                              pattern: 
                                (pat.Words
                                  words: [
                                    {
                                      (word_part.EscapedLiteral
                                        token: <Id.Lit_EscapedChar '\\#'>
                                        ch: '#'
                                      ) <Id.Lit_Star '*'>
                                    }
                                    {(SQ )}
                                  ]
                                )
                              middle: <Id.Right_CasePat _>
                              action: []
                              right: <Id.Op_DSemi _>
                            )
                            (CaseArm
                              left: <Id.Lit_Star '*'>
                              pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                              middle: <Id.Right_CasePat _>
                              action: [
                                (command.Simple
                                  blame_tok: <echo>
                                  more_env: []
                                  words: [
                                    {<echo>}
                                    {<-n>}
                                    {
                                      (DQ (${ Id.VSub_Name _prefix) 
                                        (CommandSub
                                          left_token: <Id.Left_Backtick '`'>
                                          child: 
                                            (command.Simple
                                              blame_tok: <basename>
                                              more_env: []
                                              words: [{<basename>} {($ Id.VSub_DollarName _path)}]
                                              redirects: []
                                              do_fork: T
                                            )
                                          right: <Id.Backtick_Right '`'>
                                        )
                                      )
                                    }
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                                (command.ShAssignment
                                  left: <Id.Lit_VarLike '_prefix='>
                                  pairs: [
                                    (AssignPair
                                      left: <Id.Lit_VarLike '_prefix='>
                                      lhs: 
                                        (sh_lhs_expr.Name
                                          left: <Id.Lit_VarLike '_prefix='>
                                          name: _prefix
                                        )
                                      op: assign_op.Equal
                                      rhs: {(SQ <' '>)}
                                    )
                                  ]
                                  redirects: []
                                )
                              ]
                              right: <Id.Op_DSemi _>
                            )
                          ]
                          arms_end: <Id.KW_Esac esac>
                          redirects: []
                        )
                      ]
                      right: <Id.KW_Done done>
                    )
                  redirects: []
                )
              ]
              ops: [<Id.Op_Pipe _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-x>}
                    {(DQ (${ Id.VSub_Name NOLOGIN_PATH))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.Simple
                  blame_tok: <echo>
                  more_env: []
                  words: [{<echo>} {<-n>} {(DQ <' '> (${ Id.VSub_Name NOLOGIN))}]
                  redirects: []
                  do_fork: T
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <fullpath_from_shell>
      name: fullpath_from_shell
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike '_shell='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_shell='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_shell='> name:_shell)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number 1)}
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-z>}
                    {(DQ ($ Id.VSub_DollarName _shell))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ControlFlow
                  keyword: <Id.ControlFlow_Return return>
                  arg_word: {<1>}
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (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_DollarName _shell))}
                                {<Id.Lit_Equals '='>}
                                {(DQ (${ Id.VSub_Name NOLOGIN))}
                                {<-o>}
                                {(DQ ($ Id.VSub_DollarName _shell))}
                                {<Id.Lit_Equals '='>}
                                {(DQ (${ Id.VSub_Name NOLOGIN_PATH))}
                                {<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>} {(${ Id.VSub_Name NOLOGIN_PATH)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Sentence
                      child: 
                        (command.ControlFlow
                          keyword: <Id.ControlFlow_Return return>
                          arg_word: {<0>}
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  spids: [701 736]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Pipeline
              children: [
                (command.Simple
                  blame_tok: <cat>
                  more_env: []
                  words: [{<cat>} {(${ Id.VSub_Name ETCSHELLS)}]
                  redirects: []
                  do_fork: T
                )
                (command.WhileUntil
                  keyword: <Id.KW_While while>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Simple
                              blame_tok: <read>
                              more_env: []
                              words: [{<read>} {<_path>} {<_junk>}]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  body: 
                    (command.DoGroup
                      left: <Id.KW_Do do>
                      children: [
                        (command.Case
                          case_kw: <Id.KW_Case case>
                          to_match: (case_arg.Word w:{(DQ ($ Id.VSub_DollarName _path))})
                          arms_start: <Id.KW_In in>
                          arms: [
                            (CaseArm
                              left: <Id.Lit_EscapedChar '\\#'>
                              pattern: 
                                (pat.Words
                                  words: [
                                    {
                                      (word_part.EscapedLiteral
                                        token: <Id.Lit_EscapedChar '\\#'>
                                        ch: '#'
                                      ) <Id.Lit_Star '*'>
                                    }
                                    {(SQ )}
                                  ]
                                )
                              middle: <Id.Right_CasePat _>
                              action: []
                              right: <Id.Op_DSemi _>
                            )
                            (CaseArm
                              left: <Id.Lit_Star '*'>
                              pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                              middle: <Id.Right_CasePat _>
                              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_DollarName _path))}
                                                    {<Id.Lit_Equals '='>}
                                                    {(DQ ($ Id.VSub_DollarName _shell))}
                                                    {<-o>}
                                                    {
                                                      (DQ 
                                                        (CommandSub
                                                          left_token: <Id.Left_Backtick '`'>
                                                          child: 
                                                            (command.Simple
                                                              blame_tok: <basename>
                                                              more_env: []
                                                              words: [
                                                                {<basename>}
                                                                {($ Id.VSub_DollarName _path)}
                                                              ]
                                                              redirects: []
                                                              do_fork: T
                                                            )
                                                          right: <Id.Backtick_Right '`'>
                                                        )
                                                      )
                                                    }
                                                    {<Id.Lit_Equals '='>}
                                                    {(DQ ($ Id.VSub_DollarName _shell))}
                                                    {<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>} {($ Id.VSub_DollarName _path)}]
                                          redirects: []
                                          do_fork: T
                                        )
                                        (command.ControlFlow
                                          keyword: <Id.ControlFlow_Return return>
                                          arg_word: {<0>}
                                        )
                                      ]
                                      spids: [802 839]
                                    )
                                  ]
                                  else_action: []
                                  fi_kw: <Id.KW_Fi fi>
                                  redirects: []
                                )
                              ]
                              right: <Id.Op_DSemi _>
                            )
                          ]
                          arms_end: <Id.KW_Esac esac>
                          redirects: []
                        )
                      ]
                      right: <Id.KW_Done done>
                    )
                  redirects: []
                )
              ]
              ops: [<Id.Op_Pipe _>]
            )
            (command.ControlFlow keyword:<Id.ControlFlow_Return return> arg_word:{<1>})
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <shell_exists>
      name: shell_exists
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike '_sh='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_sh='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_sh='> name:_sh)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Number 1))}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_shellchk='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_shellchk='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_shellchk='> name:_shellchk)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ (${ Id.VSub_Name GREPCMD) <' \'^'> ($ Id.VSub_DollarName _sh) 
                        <Id.Lit_Dollar '$'> <'\' '> (${ Id.VSub_Name ETCSHELLS) <' > /dev/null 2>&1'>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              negated: <Id.KW_Bang '!'>
                              children: [
                                (command.Simple
                                  blame_tok: <eval>
                                  more_env: []
                                  words: [{<eval>} {($ Id.VSub_DollarName _shellchk)}]
                                  redirects: []
                                  do_fork: T
                                )
                              ]
                              ops: []
                            )
                          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_DollarName _sh))}
                                        {<Id.KW_Bang '!'> <Id.Lit_Equals '='>}
                                        {(DQ (${ Id.VSub_Name NOLOGIN_PATH))}
                                        {<Id.Lit_RBracket ']'>}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <err>
                              more_env: []
                              words: [
                                {<err>}
                                {
                                  (DQ <'Invalid shell ('> ($ Id.VSub_DollarName _sh) <') for user '> 
                                    ($ Id.VSub_DollarName username) <.>
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.ControlFlow
                              keyword: <Id.ControlFlow_Return return>
                              arg_word: {<1>}
                            )
                          ]
                          spids: [939 959]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [923 932]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Pipeline
                  negated: <Id.KW_Bang '!'>
                  children: [
                    (command.Simple
                      blame_tok: <Id.Lit_LBracket '['>
                      more_env: []
                      words: [
                        {<Id.Lit_LBracket '['>}
                        {<-x>}
                        {(DQ ($ Id.VSub_DollarName _sh))}
                        {<Id.Lit_RBracket ']'>}
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  ops: []
                )
                (command.Simple
                  blame_tok: <info>
                  more_env: []
                  words: [
                    {<info>}
                    {
                      (DQ <'The shell ('> ($ Id.VSub_DollarName _sh) 
                        <') does not exist or is not executable.'>
                      )
                    }
                  ]
                  redirects: []
                  do_fork: T
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.ControlFlow keyword:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <save_config>
      name: save_config
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'# Configuration file for adduser(8).'>)}]
              redirects: [
                (Redir
                  op: <Id.Redir_Great '>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'# NOTE: only *some* variables are saved.'>)}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [
                {<echo>}
                {
                  (DQ <'# Last Modified on '> 
                    (CommandSub
                      left_token: <Id.Left_Backtick '`'>
                      child: 
                        (command.Simple
                          blame_tok: <Id.Left_DollarBrace '${'>
                          more_env: []
                          words: [{(${ Id.VSub_Name DATECMD)}]
                          redirects: []
                          do_fork: T
                        )
                      right: <Id.Backtick_Right '`'>
                    ) <.>
                  )
                }
              ]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(SQ )}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'defaultHomePerm='> ($ Id.VSub_DollarName uhomeperm))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'defaultLgroup='> ($ Id.VSub_DollarName ulogingroup))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'defaultclass='> ($ Id.VSub_DollarName uclass))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'defaultgroups='> ($ Id.VSub_DollarName ugroups))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'passwdtype='> ($ Id.VSub_DollarName passwdtype))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'homeprefix='> ($ Id.VSub_DollarName homeprefix))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'defaultshell='> ($ Id.VSub_DollarName ushell))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'udotdir='> ($ Id.VSub_DollarName udotdir))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'msgfile='> ($ Id.VSub_DollarName msgfile))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'disableflag='> ($ Id.VSub_DollarName disableflag))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
            (command.Simple
              blame_tok: <echo>
              more_env: []
              words: [{<echo>} {(DQ <'uidstart='> ($ Id.VSub_DollarName uidstart))}]
              redirects: [
                (Redir
                  op: <Id.Redir_DGreat '>>'>
                  loc: (redir_loc.Fd fd:1)
                  arg: {(${ Id.VSub_Name ADDUSERCONF)}
                )
              ]
              do_fork: T
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <add_user>
      name: add_user
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (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 '['>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName configflag))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <save_config>
                      more_env: []
                      words: [{<save_config>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow keyword:<Id.ControlFlow_Return return>)
                  ]
                  spids: [1281 1294]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_uid='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_uid='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_uid='> name:_uid)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_name='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_name='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_name='> name:_name)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_comment='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_comment='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_comment='> name:_comment)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_gecos='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_gecos='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_gecos='> name:_gecos)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_home='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_home='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_home='> name:_home)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_group='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_group='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_group='> name:_group)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_grouplist='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_grouplist='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_grouplist='> name:_grouplist)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_shell='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_shell='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_shell='> name:_shell)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_class='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_class='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_class='> name:_class)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_dotdir='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_dotdir='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_dotdir='> name:_dotdir)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_expire='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_expire='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_expire='> name:_expire)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_pwexpire='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_pwexpire='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pwexpire='> name:_pwexpire)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_passwd='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_passwd='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_passwd='> name:_passwd)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_upasswd='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_upasswd='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_upasswd='> name:_upasswd)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_passwdmethod='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_passwdmethod='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_passwdmethod='> name:_passwdmethod)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_name='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_name='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_name='> name:_name)
                  op: assign_op.Equal
                  rhs: {(DQ <'-n \''> ($ Id.VSub_DollarName username) <'\''>)}
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName uuid))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_uid='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_uid='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_uid='> name:_uid)
                      op: assign_op.Equal
                      rhs: {(SQ <'-u "$uuid"'>)}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName ulogingroup))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_group='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_group='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_group='> name:_group)
                      op: assign_op.Equal
                      rhs: {(SQ <'-g "$ulogingroup"'>)}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName ugroups))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_grouplist='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_grouplist='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_grouplist='> name:_grouplist)
                      op: assign_op.Equal
                      rhs: {(SQ <'-G "$ugroups"'>)}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName ushell))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_shell='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_shell='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_shell='> name:_shell)
                      op: assign_op.Equal
                      rhs: {(SQ <'-s "$ushell"'>)}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName uclass))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_class='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_class='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_class='> name:_class)
                      op: assign_op.Equal
                      rhs: {(SQ <'-L "$uclass"'>)}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName ugecos))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_comment='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_comment='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_comment='> name:_comment)
                      op: assign_op.Equal
                      rhs: {(SQ <'-c "$ugecos"'>)}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName udotdir))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_dotdir='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_dotdir='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_dotdir='> name:_dotdir)
                      op: assign_op.Equal
                      rhs: {(SQ <'-k "$udotdir"'>)}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName uexpire))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_expire='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_expire='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_expire='> name:_expire)
                      op: assign_op.Equal
                      rhs: {(SQ <'-e "$uexpire"'>)}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName upwexpire))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_pwexpire='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_pwexpire='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pwexpire='> name:_pwexpire)
                      op: assign_op.Equal
                      rhs: {(SQ <'-p "$upwexpire"'>)}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName Dflag))}
                                {<-a>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName uhome))}
                                {<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_DollarName uhome))}
                                        {<Id.Lit_Equals '='>}
                                        {(DQ ($ Id.VSub_DollarName NOHOME))}
                                        {<Id.Lit_RBracket ']'>}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike '_home='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike '_home='>
                                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_home='> name:_home)
                                  op: assign_op.Equal
                                  rhs: {(SQ <'-d "$uhome"'>)}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          spids: [1555 1572]
                        )
                      ]
                      else_kw: <Id.KW_Else else>
                      else_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 '['>}
                                            {<-n>}
                                            {(DQ ($ Id.VSub_DollarName uhomeperm))}
                                            {<Id.Lit_RBracket ']'>}
                                          ]
                                          redirects: []
                                          do_fork: T
                                        )
                                      terminator: <Id.Op_Semi _>
                                    )
                                  ]
                                )
                              then_kw: <Id.KW_Then then>
                              action: [
                                (command.ShAssignment
                                  left: <Id.Lit_VarLike '_home='>
                                  pairs: [
                                    (AssignPair
                                      left: <Id.Lit_VarLike '_home='>
                                      lhs: 
                                        (sh_lhs_expr.Name
                                          left: <Id.Lit_VarLike '_home='>
                                          name: _home
                                        )
                                      op: assign_op.Equal
                                      rhs: {(SQ <'-m -d "$uhome" -M "$uhomeperm"'>)}
                                    )
                                  ]
                                  redirects: []
                                )
                              ]
                              spids: [1588 1601]
                            )
                          ]
                          else_kw: <Id.KW_Else else>
                          else_action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike '_home='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike '_home='>
                                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_home='> name:_home)
                                  op: assign_op.Equal
                                  rhs: {(SQ <'-m -d "$uhome"'>)}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          fi_kw: <Id.KW_Fi fi>
                          redirects: []
                        )
                      ]
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [1523 1544]
                )
                (IfArm
                  keyword: <Id.KW_Elif elif>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Simple
                              blame_tok: <Id.Lit_LBracket '['>
                              more_env: []
                              words: [
                                {<Id.Lit_LBracket '['>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName Dflag))}
                                {<-a>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName uhome))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_home='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_home='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_home='> name:_home)
                          op: assign_op.Equal
                          rhs: {(SQ <'-d "$uhome"'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  spids: [1625 1646]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Case
              case_kw: <Id.KW_Case case>
              to_match: (case_arg.Word w:{($ Id.VSub_DollarName passwdtype)})
              arms_start: <Id.KW_In in>
              arms: [
                (CaseArm
                  left: <no>
                  pattern: (pat.Words words:[{<no>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_passwdmethod='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_passwdmethod='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike '_passwdmethod='>
                              name: _passwdmethod
                            )
                          op: assign_op.Equal
                          rhs: {(DQ <'-w no'>)}
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_passwd='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_passwd='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_passwd='> name:_passwd)
                          op: assign_op.Equal
                          rhs: {(DQ <'-h -'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <yes>
                  pattern: (pat.Words words:[{<yes>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_passwdmethod='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_passwdmethod='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike '_passwdmethod='>
                              name: _passwdmethod
                            )
                          op: assign_op.Equal
                          rhs: {(DQ <'-w yes'>)}
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_passwd='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_passwd='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_passwd='> name:_passwd)
                          op: assign_op.Equal
                          rhs: {(DQ <'-h 0'>)}
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_upasswd='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_upasswd='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_upasswd='> name:_upasswd)
                          op: assign_op.Equal
                          rhs: {(SQ <'echo "$upass" |'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <none>
                  pattern: (pat.Words words:[{<none>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_passwdmethod='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_passwdmethod='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike '_passwdmethod='>
                              name: _passwdmethod
                            )
                          op: assign_op.Equal
                          rhs: {(DQ <'-w none'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <random>
                  pattern: (pat.Words words:[{<random>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_passwdmethod='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_passwdmethod='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike '_passwdmethod='>
                              name: _passwdmethod
                            )
                          op: assign_op.Equal
                          rhs: {(DQ <'-w random'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
              ]
              arms_end: <Id.KW_Esac esac>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_pwcmd='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_pwcmd='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pwcmd='> name:_pwcmd)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ($ Id.VSub_DollarName _upasswd) <' '> (${ Id.VSub_Name PWCMD) <' useradd '> 
                        ($ Id.VSub_DollarName _uid) <' '> ($ Id.VSub_DollarName _name) <' '> ($ Id.VSub_DollarName _group) <' '> 
                        ($ Id.VSub_DollarName _grouplist) <' '> ($ Id.VSub_DollarName _comment)
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_pwcmd='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_pwcmd='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pwcmd='> name:_pwcmd)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ($ Id.VSub_DollarName _pwcmd) <' '> ($ Id.VSub_DollarName _shell) <' '> 
                        ($ Id.VSub_DollarName _class) <' '> ($ Id.VSub_DollarName _home) <' '> ($ Id.VSub_DollarName _dotdir) <' '> 
                        ($ Id.VSub_DollarName _passwdmethod) <' '> ($ Id.VSub_DollarName _passwd)
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_pwcmd='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_pwcmd='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pwcmd='> name:_pwcmd)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ ($ Id.VSub_DollarName _pwcmd) <' '> ($ Id.VSub_DollarName _expire) <' '> 
                        ($ Id.VSub_DollarName _pwexpire)
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.If
              if_kw: <Id.KW_If if>
              arms: [
                (IfArm
                  keyword: <Id.KW_If if>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              negated: <Id.KW_Bang '!'>
                              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: 
                                        {
                                          (CommandSub
                                            left_token: <Id.Left_Backtick '`'>
                                            child: 
                                              (command.Simple
                                                blame_tok: <eval>
                                                more_env: []
                                                words: [{<eval>} {($ Id.VSub_DollarName _pwcmd)}]
                                                redirects: []
                                                do_fork: T
                                              )
                                            right: <Id.Backtick_Right '`'>
                                          )
                                        }
                                    )
                                  ]
                                  redirects: []
                                )
                              ]
                              ops: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <err>
                      more_env: []
                      words: [
                        {<err>}
                        {
                          (DQ <'There was an error adding user ('> ($ Id.VSub_DollarName username) 
                            <').'>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Return return>
                      arg_word: {<1>}
                    )
                  ]
                  spids: [1812 1827]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.Simple
                  blame_tok: <info>
                  more_env: []
                  words: [
                    {<info>}
                    {
                      (DQ <'Successfully added ('> ($ Id.VSub_DollarName username) 
                        <') to the user database.'>
                      )
                    }
                  ]
                  redirects: []
                  do_fork: T
                )
                (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 <random>)}
                                    {<Id.Lit_Equals '='>}
                                    {(DQ ($ Id.VSub_DollarName passwdtype))}
                                    {<Id.Lit_RBracket ']'>}
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                              terminator: <Id.Op_Semi _>
                            )
                          ]
                        )
                      then_kw: <Id.KW_Then then>
                      action: [
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'randompass='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'randompass='>
                              lhs: 
                                (sh_lhs_expr.Name
                                  left: <Id.Lit_VarLike 'randompass='>
                                  name: randompass
                                )
                              op: assign_op.Equal
                              rhs: {(DQ ($ Id.VSub_DollarName _output))}
                            )
                          ]
                          redirects: []
                        )
                        (command.Simple
                          blame_tok: <info>
                          more_env: []
                          words: [
                            {<info>}
                            {
                              (DQ <'Password for ('> ($ Id.VSub_DollarName username) <') is: '> 
                                ($ Id.VSub_DollarName randompass)
                              )
                            }
                          ]
                          redirects: []
                          do_fork: T
                        )
                      ]
                      spids: [1856 1873]
                    )
                  ]
                  else_action: []
                  fi_kw: <Id.KW_Fi fi>
                  redirects: []
                )
              ]
              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 '['>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName disableflag))}
                                {<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.Left_DollarBrace '${'>
                                      more_env: []
                                      words: [
                                        {(${ Id.VSub_Name PWCMD)}
                                        {<lock>}
                                        {($ Id.VSub_DollarName username)}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <info>
                              more_env: []
                              words: [
                                {<info>}
                                {(DQ <'Account ('> ($ Id.VSub_DollarName username) <') is locked.'>)}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          ]
                          spids: [1915 1927]
                        )
                      ]
                      else_kw: <Id.KW_Else else>
                      else_action: [
                        (command.Simple
                          blame_tok: <info>
                          more_env: []
                          words: [
                            {<info>}
                            {
                              (DQ <'Account ('> ($ Id.VSub_DollarName username) 
                                <') could NOT be locked.'>
                              )
                            }
                          ]
                          redirects: []
                          do_fork: T
                        )
                      ]
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [1899 1912]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_line='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_line='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_line='> name:_line)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_owner='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_owner='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_owner='> name:_owner)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_perms='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_perms='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_perms='> name:_perms)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              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 '['>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName msgflag))}
                                {<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: <Id.Lit_LBracket '['>
                          more_env: []
                          words: [
                            {<Id.Lit_LBracket '['>}
                            {<-r>}
                            {(DQ ($ Id.VSub_DollarName msgfile))}
                            {<Id.Lit_RBracket ']'>}
                          ]
                          redirects: []
                          do_fork: T
                        )
                        (BraceGroup
                          left: <Id.Lit_LBrace '{'>
                          children: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike '_dir='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike '_dir='>
                                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_dir='> name:_dir)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ 
                                        (CommandSub
                                          left_token: <Id.Left_Backtick '`'>
                                          child: 
                                            (command.Simple
                                              blame_tok: <dirname>
                                              more_env: []
                                              words: [{<dirname>} {($ Id.VSub_DollarName msgfile)}]
                                              redirects: []
                                              do_fork: T
                                            )
                                          right: <Id.Backtick_Right '`'>
                                        )
                                      )
                                    }
                                )
                              ]
                              redirects: []
                            )
                            (command.ShAssignment
                              left: <Id.Lit_VarLike '_file='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike '_file='>
                                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_file='> name:_file)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (DQ 
                                        (CommandSub
                                          left_token: <Id.Left_Backtick '`'>
                                          child: 
                                            (command.Simple
                                              blame_tok: <basename>
                                              more_env: []
                                              words: [{<basename>} {($ Id.VSub_DollarName msgfile)}]
                                              redirects: []
                                              do_fork: T
                                            )
                                          right: <Id.Backtick_Right '`'>
                                        )
                                      )
                                    }
                                )
                              ]
                              redirects: []
                            )
                            (command.ShAssignment
                              left: <Id.Lit_VarLike '_perms='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike '_perms='>
                                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_perms='> name:_perms)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (CommandSub
                                        left_token: <Id.Left_Backtick '`'>
                                        child: 
                                          (command.Simple
                                            blame_tok: <'/usr/bin/find'>
                                            more_env: []
                                            words: [
                                              {<'/usr/bin/find'>}
                                              {($ Id.VSub_DollarName _dir)}
                                              {<-name>}
                                              {($ Id.VSub_DollarName _file)}
                                              {<-perm>}
                                              {<Id.Lit_Other '+'> <07022>}
                                              {<-prune>}
                                            ]
                                            redirects: []
                                            do_fork: T
                                          )
                                        right: <Id.Backtick_Right '`'>
                                      )
                                    }
                                )
                              ]
                              redirects: []
                            )
                            (command.ShAssignment
                              left: <Id.Lit_VarLike '_owner='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike '_owner='>
                                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_owner='> name:_owner)
                                  op: assign_op.Equal
                                  rhs: 
                                    {
                                      (CommandSub
                                        left_token: <Id.Left_Backtick '`'>
                                        child: 
                                          (command.Simple
                                            blame_tok: <'/usr/bin/find'>
                                            more_env: []
                                            words: [
                                              {<'/usr/bin/find'>}
                                              {($ Id.VSub_DollarName _dir)}
                                              {<-name>}
                                              {($ Id.VSub_DollarName _file)}
                                              {<-user>}
                                              {<0>}
                                              {<-prune>}
                                            ]
                                            redirects: []
                                            do_fork: T
                                          )
                                        right: <Id.Backtick_Right '`'>
                                      )
                                    }
                                )
                              ]
                              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 '['>}
                                                {<-z>}
                                                {(DQ ($ Id.VSub_DollarName _owner))}
                                                {<-o>}
                                                {<-n>}
                                                {(DQ ($ Id.VSub_DollarName _perms))}
                                                {<Id.Lit_RBracket ']'>}
                                              ]
                                              redirects: []
                                              do_fork: T
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  then_kw: <Id.KW_Then then>
                                  action: [
                                    (command.Simple
                                      blame_tok: <err>
                                      more_env: []
                                      words: [
                                        {<err>}
                                        {
                                          (DQ <'The message file ('> ($ Id.VSub_DollarName msgfile) 
                                            <') may be writeable only by root.'>
                                          )
                                        }
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.ControlFlow
                                      keyword: <Id.ControlFlow_Return return>
                                      arg_word: {<1>}
                                    )
                                  ]
                                  spids: [2083 2104]
                                )
                              ]
                              else_action: []
                              fi_kw: <Id.KW_Fi fi>
                              redirects: []
                            )
                            (command.Pipeline
                              children: [
                                (command.Simple
                                  blame_tok: <cat>
                                  more_env: []
                                  words: [{<cat>} {(DQ ($ Id.VSub_DollarName msgfile))}]
                                  redirects: []
                                  do_fork: T
                                )
                                (command.WhileUntil
                                  keyword: <Id.KW_While while>
                                  cond: 
                                    (condition.Shell
                                      commands: [
                                        (command.Sentence
                                          child: 
                                            (command.Simple
                                              blame_tok: <read>
                                              more_env: []
                                              words: [{<read>} {<_line>}]
                                              redirects: []
                                              do_fork: T
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  body: 
                                    (command.DoGroup
                                      left: <Id.KW_Do do>
                                      children: [
                                        (command.Simple
                                          blame_tok: <eval>
                                          more_env: []
                                          words: [{<eval>} {<echo>} {(DQ ($ Id.VSub_DollarName _line))}]
                                          redirects: []
                                          do_fork: T
                                        )
                                      ]
                                      right: <Id.KW_Done done>
                                    )
                                  redirects: []
                                )
                                (command.Simple
                                  blame_tok: <Id.Left_DollarBrace '${'>
                                  more_env: []
                                  words: [
                                    {(${ Id.VSub_Name MAILCMD)}
                                    {<-s> (DQ <Welcome>)}
                                    {(${ Id.VSub_Name username)}
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                              ]
                              ops: [<Id.Op_Pipe _> <Id.Op_Pipe _>]
                            )
                            (command.Simple
                              blame_tok: <info>
                              more_env: []
                              words: [
                                {<info>}
                                {
                                  (DQ <'Sent welcome message to ('> ($ Id.VSub_DollarName username) 
                                    <').'>
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                          ]
                          redirects: []
                          right: <Id.Lit_RBrace '}'>
                        )
                      ]
                      ops: [<Id.Op_DAmp _>]
                    )
                  ]
                  spids: [1967 1980]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_user>
      name: get_user
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike '_input='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_input='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName configflag))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ControlFlow keyword:<Id.ControlFlow_Return return>)
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <Id.Lit_Colon ':'>
                          more_env: []
                          words: [{<Id.Lit_Colon ':'>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (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 '['>}
                                        {<-z>}
                                        {(DQ ($ Id.VSub_DollarName fflag))}
                                        {<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>} {<-n>} {(DQ <'Username: '>)}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <read>
                              more_env: []
                              words: [{<read>} {<_input>}]
                              redirects: []
                              do_fork: T
                            )
                          ]
                          spids: [2249 2262]
                        )
                      ]
                      else_kw: <Id.KW_Else else>
                      else_action: [
                        (command.ShAssignment
                          left: <Id.Lit_VarLike '_input='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike '_input='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (DQ 
                                    (CommandSub
                                      left_token: <Id.Left_Backtick '`'>
                                      child: 
                                        (command.Pipeline
                                          children: [
                                            (command.Simple
                                              blame_tok: <echo>
                                              more_env: []
                                              words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.Simple
                                              blame_tok: <cut>
                                              more_env: []
                                              words: [{<cut>} {<-f1>} {<-d> <Id.Lit_Colon ':'>}]
                                              redirects: []
                                              do_fork: T
                                            )
                                          ]
                                          ops: [<Id.Op_Pipe _>]
                                        )
                                      right: <Id.Backtick_Right '`'>
                                    )
                                  )
                                }
                            )
                          ]
                          redirects: []
                        )
                      ]
                      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 '['>}
                                        {<-z>}
                                        {(DQ ($ Id.VSub_DollarName _input))}
                                        {<Id.Lit_RBracket ']'>}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <err>
                              more_env: []
                              words: [{<err>} {(DQ <'You must enter a username!'>)}]
                              redirects: []
                              do_fork: T
                            )
                            (command.AndOr
                              children: [
                                (command.Simple
                                  blame_tok: <Id.Lit_LBracket '['>
                                  more_env: []
                                  words: [
                                    {<Id.Lit_LBracket '['>}
                                    {<-z>}
                                    {(DQ ($ Id.VSub_DollarName fflag))}
                                    {<Id.Lit_RBracket ']'>}
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                                (command.ControlFlow
                                  keyword: <Id.ControlFlow_Continue continue>
                                )
                              ]
                              ops: [<Id.Op_DAmp _>]
                            )
                          ]
                          spids: [2325 2338]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <Id.Left_DollarBrace '${'>
                      more_env: []
                      words: [{(${ Id.VSub_Name PWCMD)} {<usershow>} {($ Id.VSub_DollarName _input)}]
                      redirects: [
                        (Redir
                          op: <Id.Redir_Great '>'>
                          loc: (redir_loc.Fd fd:1)
                          arg: {<'/dev/null'>}
                        )
                        (Redir
                          op: <Id.Redir_GreatAnd '2>&'>
                          loc: (redir_loc.Fd fd:2)
                          arg: {<1>}
                        )
                      ]
                      do_fork: T
                    )
                    (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_QMark '?'))}
                                        {<-eq>}
                                        {<0>}
                                        {<Id.Lit_RBracket ']'>}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <err>
                              more_env: []
                              words: [{<err>} {(DQ <'User exists!'>)}]
                              redirects: []
                              do_fork: T
                            )
                            (command.AndOr
                              children: [
                                (command.Simple
                                  blame_tok: <Id.Lit_LBracket '['>
                                  more_env: []
                                  words: [
                                    {<Id.Lit_LBracket '['>}
                                    {<-z>}
                                    {(DQ ($ Id.VSub_DollarName fflag))}
                                    {<Id.Lit_RBracket ']'>}
                                  ]
                                  redirects: []
                                  do_fork: T
                                )
                                (command.ControlFlow
                                  keyword: <Id.ControlFlow_Continue continue>
                                )
                              ]
                              ops: [<Id.Op_DAmp _>]
                            )
                          ]
                          spids: [2382 2397]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                    (command.ControlFlow keyword:<Id.ControlFlow_Break break>)
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'username='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'username='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'username='> name:username)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName _input))}
                )
              ]
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_gecos>
      name: get_gecos
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike '_input='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_input='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName configflag))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ControlFlow keyword:<Id.ControlFlow_Return return>)
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName fflag))}
                                {<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>} {<-n>} {(DQ <'Full name: '>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <read>
                      more_env: []
                      words: [{<read>} {<_input>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [2482 2495]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_input='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_input='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (CommandSub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (command.Simple
                                      blame_tok: <echo>
                                      more_env: []
                                      words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.Simple
                                      blame_tok: <cut>
                                      more_env: []
                                      words: [{<cut>} {<-f7>} {<-d> <Id.Lit_Colon ':'>}]
                                      redirects: []
                                      do_fork: T
                                    )
                                  ]
                                  ops: [<Id.Op_Pipe _>]
                                )
                              right: <Id.Backtick_Right '`'>
                            )
                          )
                        }
                    )
                  ]
                  redirects: []
                )
              ]
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'ugecos='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'ugecos='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ugecos='> name:ugecos)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName _input))}
                )
              ]
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_shell>
      name: get_shell
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike '_input='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_input='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_fullpath='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_fullpath='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_fullpath='> name:_fullpath)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'ushell='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'ushell='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ushell='> name:ushell)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName defaultshell))}
                )
              ]
              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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName Sflag))}
                                {<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.Pipeline
                                      negated: <Id.KW_Bang '!'>
                                      children: [
                                        (command.Simple
                                          blame_tok: <shell_exists>
                                          more_env: []
                                          words: [{<shell_exists>} {($ Id.VSub_DollarName ushell)}]
                                          redirects: []
                                          do_fork: T
                                        )
                                      ]
                                      ops: []
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <info>
                              more_env: []
                              words: [
                                {<info>}
                                {(DQ <'Using default shell '> (${ Id.VSub_Name defaultshell) <.>)}
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'ushell='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'ushell='>
                                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ushell='> name:ushell)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_DollarName defaultshell))}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          spids: [2604 2614]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [2588 2601]
                )
              ]
              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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName fflag))}
                                {<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>}
                        {<-n>}
                        {
                          (DQ <'Shell ('> ($ Id.VSub_DollarName shells) <') ['> 
                            (CommandSub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Simple
                                  blame_tok: <basename>
                                  more_env: []
                                  words: [{<basename>} {($ Id.VSub_DollarName ushell)}]
                                  redirects: []
                                  do_fork: T
                                )
                              right: <Id.Backtick_Right '`'>
                            ) <']: '>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <read>
                      more_env: []
                      words: [{<read>} {<_input>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [2641 2654]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_input='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_input='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (CommandSub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (command.Simple
                                      blame_tok: <echo>
                                      more_env: []
                                      words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.Simple
                                      blame_tok: <cut>
                                      more_env: []
                                      words: [{<cut>} {<-f9>} {<-d> <Id.Lit_Colon ':'>}]
                                      redirects: []
                                      do_fork: T
                                    )
                                  ]
                                  ops: [<Id.Op_Pipe _>]
                                )
                              right: <Id.Backtick_Right '`'>
                            )
                          )
                        }
                    )
                  ]
                  redirects: []
                )
              ]
              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 '['>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName _input))}
                                {<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 '['>}
                                        {<-n>}
                                        {(DQ ($ Id.VSub_DollarName Sflag))}
                                        {<Id.Lit_RBracket ']'>}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'ushell='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'ushell='>
                                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ushell='> name:ushell)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_DollarName _input))}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          spids: [2726 2739]
                        )
                      ]
                      else_kw: <Id.KW_Else else>
                      else_action: [
                        (command.ShAssignment
                          left: <Id.Lit_VarLike '_fullpath='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike '_fullpath='>
                              lhs: 
                                (sh_lhs_expr.Name
                                  left: <Id.Lit_VarLike '_fullpath='>
                                  name: _fullpath
                                )
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (CommandSub
                                    left_token: <Id.Left_Backtick '`'>
                                    child: 
                                      (command.Simple
                                        blame_tok: <fullpath_from_shell>
                                        more_env: []
                                        words: [{<fullpath_from_shell>} {($ Id.VSub_DollarName _input)}]
                                        redirects: []
                                        do_fork: T
                                      )
                                    right: <Id.Backtick_Right '`'>
                                  )
                                }
                            )
                          ]
                          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 '['>}
                                            {<-n>}
                                            {(DQ ($ Id.VSub_DollarName _fullpath))}
                                            {<Id.Lit_RBracket ']'>}
                                          ]
                                          redirects: []
                                          do_fork: T
                                        )
                                      terminator: <Id.Op_Semi _>
                                    )
                                  ]
                                )
                              then_kw: <Id.KW_Then then>
                              action: [
                                (command.ShAssignment
                                  left: <Id.Lit_VarLike 'ushell='>
                                  pairs: [
                                    (AssignPair
                                      left: <Id.Lit_VarLike 'ushell='>
                                      lhs: 
                                        (sh_lhs_expr.Name
                                          left: <Id.Lit_VarLike 'ushell='>
                                          name: ushell
                                        )
                                      op: assign_op.Equal
                                      rhs: {(DQ ($ Id.VSub_DollarName _fullpath))}
                                    )
                                  ]
                                  redirects: []
                                )
                              ]
                              spids: [2761 2774]
                            )
                          ]
                          else_kw: <Id.KW_Else else>
                          else_action: [
                            (command.Simple
                              blame_tok: <err>
                              more_env: []
                              words: [
                                {<err>}
                                {
                                  (DQ <'Invalid shell ('> ($ Id.VSub_DollarName _input) <') for user '> 
                                    ($ Id.VSub_DollarName username) <.>
                                  )
                                }
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <info>
                              more_env: []
                              words: [
                                {<info>}
                                {(DQ <'Using default shell '> (${ Id.VSub_Name defaultshell) <.>)}
                              ]
                              redirects: []
                              do_fork: T
                            )
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'ushell='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'ushell='>
                                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ushell='> name:ushell)
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_DollarName defaultshell))}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          fi_kw: <Id.KW_Fi fi>
                          redirects: []
                        )
                      ]
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [2710 2723]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_homedir>
      name: get_homedir
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike '_input='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_input='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName fflag))}
                                {<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>}
                        {<-n>}
                        {
                          (DQ <'Home directory ['> (${ Id.VSub_Name homeprefix) <'/'> 
                            (${ Id.VSub_Name username) <']: '>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <read>
                      more_env: []
                      words: [{<read>} {<_input>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [2847 2860]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_input='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_input='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (CommandSub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (command.Simple
                                      blame_tok: <echo>
                                      more_env: []
                                      words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.Simple
                                      blame_tok: <cut>
                                      more_env: []
                                      words: [{<cut>} {<-f8>} {<-d> <Id.Lit_Colon ':'>}]
                                      redirects: []
                                      do_fork: T
                                    )
                                  ]
                                  ops: [<Id.Op_Pipe _>]
                                )
                              right: <Id.Backtick_Right '`'>
                            )
                          )
                        }
                    )
                  ]
                  redirects: []
                )
              ]
              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 '['>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName _input))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'uhome='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'uhome='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhome='> name:uhome)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName _input))}
                        )
                      ]
                      redirects: []
                    )
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <Id.Lit_LBracket '['>
                          more_env: []
                          words: [
                            {<Id.Lit_LBracket '['>}
                            {<-z>}
                            {(DQ ($ Id.VSub_DollarName configflag))}
                            {<Id.Lit_RBracket ']'>}
                          ]
                          redirects: []
                          do_fork: T
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'homeprefix='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'homeprefix='>
                              lhs: 
                                (sh_lhs_expr.Name
                                  left: <Id.Lit_VarLike 'homeprefix='>
                                  name: homeprefix
                                )
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (DQ 
                                    (CommandSub
                                      left_token: <Id.Left_Backtick '`'>
                                      child: 
                                        (command.Simple
                                          blame_tok: <dirname>
                                          more_env: []
                                          words: [{<dirname>} {($ Id.VSub_DollarName uhome)}]
                                          redirects: []
                                          do_fork: T
                                        )
                                      right: <Id.Backtick_Right '`'>
                                    )
                                  )
                                }
                            )
                          ]
                          redirects: []
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'homeprefix='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'homeprefix='>
                              lhs: 
                                (sh_lhs_expr.Name
                                  left: <Id.Lit_VarLike 'homeprefix='>
                                  name: homeprefix
                                )
                              op: assign_op.Equal
                              rhs: {(DQ ($ Id.VSub_DollarName uhome))}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DAmp _> <Id.Op_DPipe _>]
                    )
                  ]
                  spids: [2915 2928]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'uhome='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'uhome='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhome='> name:uhome)
                      op: assign_op.Equal
                      rhs: {(DQ (${ Id.VSub_Name homeprefix) <'/'> (${ Id.VSub_Name username))}
                    )
                  ]
                  redirects: []
                )
              ]
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_homeperm>
      name: get_homeperm
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'uhomeperm='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'uhomeperm='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhomeperm='> name:uhomeperm)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName defaultHomePerm)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_input='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_input='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_prompt='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_prompt='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              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 '['>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName uhomeperm))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_prompt='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_prompt='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ <'Home directory permissions ['> (${ Id.VSub_Name uhomeperm) <']: '>)
                            }
                        )
                      ]
                      redirects: []
                    )
                  ]
                  spids: [3031 3044]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_prompt='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_prompt='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt)
                      op: assign_op.Equal
                      rhs: {(DQ <'Home directory permissions (Leave empty for default): '>)}
                    )
                  ]
                  redirects: []
                )
              ]
              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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName fflag))}
                                {<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>} {<-n>} {(DQ ($ Id.VSub_DollarName _prompt))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <read>
                      more_env: []
                      words: [{<read>} {<_input>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [3069 3082]
                )
              ]
              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 '['>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName _input))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'uhomeperm='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'uhomeperm='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhomeperm='> name:uhomeperm)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_DollarName _input))}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  spids: [3103 3116]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_uid>
      name: get_uid
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'uuid='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'uuid='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uuid='> name:uuid)
                  op: assign_op.Equal
                  rhs: {(${ Id.VSub_Name uidstart)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_input='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_input='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_prompt='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_prompt='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              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 '['>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName uuid))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'uuid='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'uuid='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uuid='> name:uuid)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (CommandSub
                                left_token: <Id.Left_Backtick '`'>
                                child: 
                                  (command.Simple
                                    blame_tok: <get_nextuid>
                                    more_env: []
                                    words: [{<get_nextuid>} {($ Id.VSub_DollarName uuid)}]
                                    redirects: []
                                    do_fork: T
                                  )
                                right: <Id.Backtick_Right '`'>
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_prompt='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_prompt='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt)
                          op: assign_op.Equal
                          rhs: {(DQ <'Uid ['> ($ Id.VSub_DollarName uuid) <']: '>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  spids: [3162 3175]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_prompt='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_prompt='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_prompt='> name:_prompt)
                      op: assign_op.Equal
                      rhs: {(DQ <'Uid (Leave empty for default): '>)}
                    )
                  ]
                  redirects: []
                )
              ]
              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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName fflag))}
                                {<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>} {<-n>} {(DQ ($ Id.VSub_DollarName _prompt))}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <read>
                      more_env: []
                      words: [{<read>} {<_input>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [3208 3221]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_input='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_input='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (CommandSub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (command.Simple
                                      blame_tok: <echo>
                                      more_env: []
                                      words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.Simple
                                      blame_tok: <cut>
                                      more_env: []
                                      words: [{<cut>} {<-f2>} {<-d> <Id.Lit_Colon ':'>}]
                                      redirects: []
                                      do_fork: T
                                    )
                                  ]
                                  ops: [<Id.Op_Pipe _>]
                                )
                              right: <Id.Backtick_Right '`'>
                            )
                          )
                        }
                    )
                  ]
                  redirects: []
                )
              ]
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName _input))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'uuid='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'uuid='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uuid='> name:uuid)
                      op: assign_op.Equal
                      rhs: {($ Id.VSub_DollarName _input)}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'uuid='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'uuid='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uuid='> name:uuid)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (CommandSub
                        left_token: <Id.Left_Backtick '`'>
                        child: 
                          (command.Simple
                            blame_tok: <get_nextuid>
                            more_env: []
                            words: [{<get_nextuid>} {($ Id.VSub_DollarName uuid)}]
                            redirects: []
                            do_fork: T
                          )
                        right: <Id.Backtick_Right '`'>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'uidstart='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'uidstart='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uidstart='> name:uidstart)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_DollarName uuid)}
                )
              ]
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_class>
      name: get_class
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'uclass='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'uclass='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uclass='> name:uclass)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName defaultclass))}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_input='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_input='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_class='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_class='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_class='> name:_class)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name uclass>
                        var_name: uclass
                        suffix_op: 
                          (suffix_op.Unary
                            op: <Id.VTest_ColonHyphen _>
                            arg_word: {(DQ <default>)}
                          )
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              ]
              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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName fflag))}
                                {<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>}
                        {<-n>}
                        {(DQ <'Login class ['> ($ Id.VSub_DollarName _class) <']: '>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <read>
                      more_env: []
                      words: [{<read>} {<_input>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [3336 3349]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_input='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_input='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (CommandSub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (command.Simple
                                      blame_tok: <echo>
                                      more_env: []
                                      words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.Simple
                                      blame_tok: <cut>
                                      more_env: []
                                      words: [{<cut>} {<-f4>} {<-d> <Id.Lit_Colon ':'>}]
                                      redirects: []
                                      do_fork: T
                                    )
                                  ]
                                  ops: [<Id.Op_Pipe _>]
                                )
                              right: <Id.Backtick_Right '`'>
                            )
                          )
                        }
                    )
                  ]
                  redirects: []
                )
              ]
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName _input))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'uclass='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'uclass='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uclass='> name:uclass)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_DollarName _input))}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_logingroup>
      name: get_logingroup
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'ulogingroup='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'ulogingroup='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ulogingroup='> name:ulogingroup)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName defaultLgroup))}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_input='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_input='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName fflag))}
                                {<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>}
                        {<-n>}
                        {
                          (DQ <'Login group ['> 
                            (BracedVarSub
                              left: <Id.Left_DollarBrace '${'>
                              token: <Id.VSub_Name ulogingroup>
                              var_name: ulogingroup
                              suffix_op: 
                                (suffix_op.Unary
                                  op: <Id.VTest_ColonHyphen _>
                                  arg_word: {($ Id.VSub_DollarName username)}
                                )
                              right: <Id.Right_DollarBrace '}'>
                            ) <']: '>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <read>
                      more_env: []
                      words: [{<read>} {<_input>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [3456 3469]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.ShAssignment
                  left: <Id.Lit_VarLike '_input='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike '_input='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                      op: assign_op.Equal
                      rhs: 
                        {
                          (DQ 
                            (CommandSub
                              left_token: <Id.Left_Backtick '`'>
                              child: 
                                (command.Pipeline
                                  children: [
                                    (command.Simple
                                      blame_tok: <echo>
                                      more_env: []
                                      words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.Simple
                                      blame_tok: <cut>
                                      more_env: []
                                      words: [{<cut>} {<-f3>} {<-d> <Id.Lit_Colon ':'>}]
                                      redirects: []
                                      do_fork: T
                                    )
                                  ]
                                  ops: [<Id.Op_Pipe _>]
                                )
                              right: <Id.Backtick_Right '`'>
                            )
                          )
                        }
                    )
                  ]
                  redirects: []
                )
              ]
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName _input))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'ulogingroup='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'ulogingroup='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ulogingroup='> name:ulogingroup)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_DollarName _input))}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_groups>
      name: get_groups
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'ugroups='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'ugroups='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ugroups='> name:ugroups)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_DollarName defaultgroups))}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_input='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_input='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_group='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_group='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_group='> name:_group)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name ulogingroup>
                        var_name: ulogingroup
                        suffix_op: 
                          (suffix_op.Unary
                            op: <Id.VTest_ColonHyphen _>
                            arg_word: {(DQ (${ Id.VSub_Name username))}
                          )
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              ]
              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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName configflag))}
                                {<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: <Id.Lit_LBracket '['>
                          more_env: []
                          words: [
                            {<Id.Lit_LBracket '['>}
                            {<-z>}
                            {(DQ ($ Id.VSub_DollarName fflag))}
                            {<Id.Lit_RBracket ']'>}
                          ]
                          redirects: []
                          do_fork: T
                        )
                        (command.Simple
                          blame_tok: <echo>
                          more_env: []
                          words: [
                            {<echo>}
                            {<-n>}
                            {
                              (DQ <'Login group is '> ($ Id.VSub_DollarName _group) <'. Invite '> 
                                ($ Id.VSub_DollarName username)
                              )
                            }
                          ]
                          redirects: []
                          do_fork: T
                        )
                      ]
                      ops: [<Id.Op_DAmp _>]
                    )
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <Id.Lit_LBracket '['>
                          more_env: []
                          words: [
                            {<Id.Lit_LBracket '['>}
                            {<-z>}
                            {(DQ ($ Id.VSub_DollarName fflag))}
                            {<Id.Lit_RBracket ']'>}
                          ]
                          redirects: []
                          do_fork: T
                        )
                        (command.Simple
                          blame_tok: <echo>
                          more_env: []
                          words: [
                            {<echo>}
                            {<-n>}
                            {(DQ <' into other groups? ['> ($ Id.VSub_DollarName ugroups) <']: '>)}
                          ]
                          redirects: []
                          do_fork: T
                        )
                      ]
                      ops: [<Id.Op_DAmp _>]
                    )
                  ]
                  spids: [3587 3600]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.AndOr
                  children: [
                    (command.Simple
                      blame_tok: <Id.Lit_LBracket '['>
                      more_env: []
                      words: [
                        {<Id.Lit_LBracket '['>}
                        {<-z>}
                        {(DQ ($ Id.VSub_DollarName fflag))}
                        {<Id.Lit_RBracket ']'>}
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {<-n>}
                        {(DQ <'Enter additional groups ['> ($ Id.VSub_DollarName ugroups) <']: '>)}
                      ]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  ops: [<Id.Op_DAmp _>]
                )
              ]
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
            (command.Simple
              blame_tok: <read>
              more_env: []
              words: [{<read>} {<_input>}]
              redirects: []
              do_fork: T
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName _input))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.ShAssignment
                  left: <Id.Lit_VarLike 'ugroups='>
                  pairs: [
                    (AssignPair
                      left: <Id.Lit_VarLike 'ugroups='>
                      lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ugroups='> name:ugroups)
                      op: assign_op.Equal
                      rhs: {(DQ ($ Id.VSub_DollarName _input))}
                    )
                  ]
                  redirects: []
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_expire_dates>
      name: get_expire_dates
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike 'upwexpire='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'upwexpire='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'upwexpire='> name:upwexpire)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (CommandSub
                          left_token: <Id.Left_Backtick '`'>
                          child: 
                            (command.Pipeline
                              children: [
                                (command.Simple
                                  blame_tok: <echo>
                                  more_env: []
                                  words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}]
                                  redirects: []
                                  do_fork: T
                                )
                                (command.Simple
                                  blame_tok: <cut>
                                  more_env: []
                                  words: [{<cut>} {<-f5>} {<-d> <Id.Lit_Colon ':'>}]
                                  redirects: []
                                  do_fork: T
                                )
                              ]
                              ops: [<Id.Op_Pipe _>]
                            )
                          right: <Id.Backtick_Right '`'>
                        )
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'uexpire='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'uexpire='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uexpire='> name:uexpire)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (DQ 
                        (CommandSub
                          left_token: <Id.Left_Backtick '`'>
                          child: 
                            (command.Pipeline
                              children: [
                                (command.Simple
                                  blame_tok: <echo>
                                  more_env: []
                                  words: [{<echo>} {(DQ ($ Id.VSub_DollarName fileline))}]
                                  redirects: []
                                  do_fork: T
                                )
                                (command.Simple
                                  blame_tok: <cut>
                                  more_env: []
                                  words: [{<cut>} {<-f6>} {<-d> <Id.Lit_Colon ':'>}]
                                  redirects: []
                                  do_fork: T
                                )
                              ]
                              ops: [<Id.Op_Pipe _>]
                            )
                          right: <Id.Backtick_Right '`'>
                        )
                      )
                    }
                )
              ]
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <get_password>
      name: get_password
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName savedpwtype))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (BraceGroup
                  left: <Id.Lit_LBrace '{'>
                  children: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'passwdtype='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'passwdtype='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'passwdtype='> name:passwdtype)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_DollarName savedpwtype)}
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'savedpwtype='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'savedpwtype='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'savedpwtype='>
                              name: savedpwtype
                            )
                          op: assign_op.Equal
                          rhs: (rhs_word__Empty)
                        )
                      ]
                      redirects: []
                    )
                  ]
                  redirects: []
                  right: <Id.Lit_RBrace '}'>
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike 'upass='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike 'upass='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'upass='> name:upass)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name fileline>
                        var_name: fileline
                        suffix_op: 
                          (suffix_op.Unary
                            op: <Id.VOp1_Pound '#'>
                            arg_word: 
                              {<Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> 
                                <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> <Id.Lit_Other '*'> <':'> 
                                <Id.Lit_Other '*'> <':'>
                              }
                          )
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              ]
              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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName upass))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Case
                      case_kw: <Id.KW_Case case>
                      to_match: (case_arg.Word w:{($ Id.VSub_DollarName passwdtype)})
                      arms_start: <Id.KW_In in>
                      arms: [
                        (CaseArm
                          left: <yes>
                          pattern: (pat.Words words:[{<yes>}])
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'passwdtype='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'passwdtype='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'passwdtype='>
                                      name: passwdtype
                                    )
                                  op: assign_op.Equal
                                  rhs: {<none>}
                                )
                              ]
                              redirects: []
                            )
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'savedpwtype='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'savedpwtype='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'savedpwtype='>
                                      name: savedpwtype
                                    )
                                  op: assign_op.Equal
                                  rhs: {<yes>}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                      ]
                      arms_end: <Id.KW_Esac esac>
                      redirects: []
                    )
                  ]
                  spids: [3871 3884]
                )
              ]
              else_kw: <Id.KW_Else else>
              else_action: [
                (command.Case
                  case_kw: <Id.KW_Case case>
                  to_match: (case_arg.Word w:{($ Id.VSub_DollarName passwdtype)})
                  arms_start: <Id.KW_In in>
                  arms: [
                    (CaseArm
                      left: <random>
                      pattern: (pat.Words words:[{<random>}])
                      middle: <Id.Right_CasePat _>
                      action: [
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'passwdtype='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'passwdtype='>
                              lhs: 
                                (sh_lhs_expr.Name
                                  left: <Id.Lit_VarLike 'passwdtype='>
                                  name: passwdtype
                                )
                              op: assign_op.Equal
                              rhs: {<yes>}
                            )
                          ]
                          redirects: []
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'savedpwtype='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'savedpwtype='>
                              lhs: 
                                (sh_lhs_expr.Name
                                  left: <Id.Lit_VarLike 'savedpwtype='>
                                  name: savedpwtype
                                )
                              op: assign_op.Equal
                              rhs: {<random>}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      right: <Id.Op_DSemi _>
                    )
                  ]
                  arms_end: <Id.KW_Esac esac>
                  redirects: []
                )
              ]
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <input_from_file>
      name: input_from_file
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike '_field='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_field='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_field='> name:_field)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <read>
                          more_env: []
                          words: [{<read>} {<-r>} {<fileline>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Case
                      case_kw: <Id.KW_Case case>
                      to_match: (case_arg.Word w:{(DQ ($ Id.VSub_DollarName fileline))})
                      arms_start: <Id.KW_In in>
                      arms: [
                        (CaseArm
                          left: <Id.Lit_EscapedChar '\\#'>
                          pattern: 
                            (pat.Words
                              words: [
                                {(word_part.EscapedLiteral token:<Id.Lit_EscapedChar '\\#'> ch:'#') 
                                  <Id.Lit_Star '*'>
                                }
                                {(SQ )}
                              ]
                            )
                          middle: <Id.Right_CasePat _>
                          action: []
                          right: <Id.Op_DSemi _>
                        )
                        (CaseArm
                          left: <Id.Lit_Star '*'>
                          pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.AndOr
                              children: [
                                (command.Simple
                                  blame_tok: <get_user>
                                  more_env: []
                                  words: [{<get_user>}]
                                  redirects: []
                                  do_fork: T
                                )
                                (command.ControlFlow
                                  keyword: <Id.ControlFlow_Continue continue>
                                )
                              ]
                              ops: [<Id.Op_DPipe _>]
                            )
                            (command.Simple
                              blame_tok: <get_gecos>
                              more_env: []
                              words: [{<get_gecos>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <get_uid>
                              more_env: []
                              words: [{<get_uid>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <get_logingroup>
                              more_env: []
                              words: [{<get_logingroup>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <get_class>
                              more_env: []
                              words: [{<get_class>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <get_shell>
                              more_env: []
                              words: [{<get_shell>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <get_homedir>
                              more_env: []
                              words: [{<get_homedir>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <get_homeperm>
                              more_env: []
                              words: [{<get_homeperm>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <get_password>
                              more_env: []
                              words: [{<get_password>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.Simple
                              blame_tok: <get_expire_dates>
                              more_env: []
                              words: [{<get_expire_dates>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'ugroups='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'ugroups='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'ugroups='>
                                      name: ugroups
                                    )
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_DollarName defaultgroups))}
                                )
                              ]
                              redirects: []
                            )
                            (command.Simple
                              blame_tok: <add_user>
                              more_env: []
                              words: [{<add_user>}]
                              redirects: []
                              do_fork: T
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                      ]
                      arms_end: <Id.KW_Esac esac>
                      redirects: []
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShFunction
      name_tok: <input_interactive>
      name: input_interactive
      body: 
        (BraceGroup
          left: <Id.Lit_LBrace '{'>
          children: [
            (command.ShAssignment
              left: <Id.Lit_VarLike '_disable='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_disable='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_disable='> name:_disable)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_pass='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_pass='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pass='> name:_pass)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_passconfirm='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_passconfirm='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_passconfirm='> name:_passconfirm)
                  op: assign_op.Equal
                  rhs: (rhs_word__Empty)
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_random='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_random='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_random='> name:_random)
                  op: assign_op.Equal
                  rhs: {(DQ <no>)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_emptypass='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_emptypass='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_emptypass='> name:_emptypass)
                  op: assign_op.Equal
                  rhs: {(DQ <no>)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_usepass='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_usepass='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_usepass='> name:_usepass)
                  op: assign_op.Equal
                  rhs: {(DQ <yes>)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_logingroup_ok='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_logingroup_ok='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_logingroup_ok='> name:_logingroup_ok)
                  op: assign_op.Equal
                  rhs: {(DQ <no>)}
                )
              ]
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_groups_ok='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_groups_ok='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_groups_ok='> name:_groups_ok)
                  op: assign_op.Equal
                  rhs: {(DQ <no>)}
                )
              ]
              redirects: []
            )
            (command.Case
              case_kw: <Id.KW_Case case>
              to_match: (case_arg.Word w:{($ Id.VSub_DollarName passwdtype)})
              arms_start: <Id.KW_In in>
              arms: [
                (CaseArm
                  left: <none>
                  pattern: (pat.Words words:[{<none>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_emptypass='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_emptypass='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_emptypass='> name:_emptypass)
                          op: assign_op.Equal
                          rhs: {(DQ <yes>)}
                        )
                      ]
                      redirects: []
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_usepass='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_usepass='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_usepass='> name:_usepass)
                          op: assign_op.Equal
                          rhs: {(DQ <yes>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <no>
                  pattern: (pat.Words words:[{<no>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_usepass='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_usepass='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_usepass='> name:_usepass)
                          op: assign_op.Equal
                          rhs: {(DQ <no>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <random>
                  pattern: (pat.Words words:[{<random>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_random='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_random='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_random='> name:_random)
                          op: assign_op.Equal
                          rhs: {(DQ <yes>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
              ]
              arms_end: <Id.KW_Esac esac>
              redirects: []
            )
            (command.Simple
              blame_tok: <get_user>
              more_env: []
              words: [{<get_user>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <get_gecos>
              more_env: []
              words: [{<get_gecos>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <get_uid>
              more_env: []
              words: [{<get_uid>}]
              redirects: []
              do_fork: T
            )
            (command.WhileUntil
              keyword: <Id.KW_Until until>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <Id.Lit_LBracket '['>
                          more_env: []
                          words: [
                            {<Id.Lit_LBracket '['>}
                            {(DQ ($ Id.VSub_DollarName _logingroup_ok))}
                            {<Id.Lit_Equals '='>}
                            {<yes>}
                            {<Id.Lit_RBracket ']'>}
                          ]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <get_logingroup>
                      more_env: []
                      words: [{<get_logingroup>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_logingroup_ok='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_logingroup_ok='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike '_logingroup_ok='>
                              name: _logingroup_ok
                            )
                          op: assign_op.Equal
                          rhs: {<yes>}
                        )
                      ]
                      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 '['>}
                                        {<-n>}
                                        {(DQ ($ Id.VSub_DollarName ulogingroup))}
                                        {<-a>}
                                        {(DQ ($ Id.VSub_DollarName username))}
                                        {<Id.KW_Bang '!'> <Id.Lit_Equals '='>}
                                        {(DQ ($ Id.VSub_DollarName ulogingroup))}
                                        {<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.Pipeline
                                              negated: <Id.KW_Bang '!'>
                                              children: [
                                                (command.Simple
                                                  blame_tok: <Id.Left_DollarBrace '${'>
                                                  more_env: []
                                                  words: [
                                                    {(${ Id.VSub_Name PWCMD)}
                                                    {<show>}
                                                    {<group>}
                                                    {($ Id.VSub_DollarName ulogingroup)}
                                                  ]
                                                  redirects: [
                                                    (Redir
                                                      op: <Id.Redir_Great '>'>
                                                      loc: (redir_loc.Fd fd:1)
                                                      arg: {<'/dev/null'>}
                                                    )
                                                    (Redir
                                                      op: <Id.Redir_GreatAnd '2>&'>
                                                      loc: (redir_loc.Fd fd:2)
                                                      arg: {<1>}
                                                    )
                                                  ]
                                                  do_fork: T
                                                )
                                              ]
                                              ops: []
                                            )
                                          terminator: <Id.Op_Semi _>
                                        )
                                      ]
                                    )
                                  then_kw: <Id.KW_Then then>
                                  action: [
                                    (command.Simple
                                      blame_tok: <echo>
                                      more_env: []
                                      words: [
                                        {<echo>}
                                        {
                                          (DQ <'Group '> ($ Id.VSub_DollarName ulogingroup) 
                                            <' does not exist!'>
                                          )
                                        }
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.ShAssignment
                                      left: <Id.Lit_VarLike '_logingroup_ok='>
                                      pairs: [
                                        (AssignPair
                                          left: <Id.Lit_VarLike '_logingroup_ok='>
                                          lhs: 
                                            (sh_lhs_expr.Name
                                              left: <Id.Lit_VarLike '_logingroup_ok='>
                                              name: _logingroup_ok
                                            )
                                          op: assign_op.Equal
                                          rhs: {<no>}
                                        )
                                      ]
                                      redirects: []
                                    )
                                  ]
                                  spids: [4250 4272]
                                )
                              ]
                              else_action: []
                              fi_kw: <Id.KW_Fi fi>
                              redirects: []
                            )
                          ]
                          spids: [4221 4247]
                        )
                      ]
                      else_action: []
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.WhileUntil
              keyword: <Id.KW_Until until>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <Id.Lit_LBracket '['>
                          more_env: []
                          words: [
                            {<Id.Lit_LBracket '['>}
                            {(DQ ($ Id.VSub_DollarName _groups_ok))}
                            {<Id.Lit_Equals '='>}
                            {<yes>}
                            {<Id.Lit_RBracket ']'>}
                          ]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <get_groups>
                      more_env: []
                      words: [{<get_groups>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_groups_ok='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_groups_ok='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_groups_ok='> name:_groups_ok)
                          op: assign_op.Equal
                          rhs: {<yes>}
                        )
                      ]
                      redirects: []
                    )
                    (command.ForEach
                      keyword: <Id.KW_For for>
                      iter_names: [i]
                      iterable: (for_iter.Words words:[{($ Id.VSub_DollarName ugroups)}])
                      semi_tok: <Id.Op_Semi _>
                      body: 
                        (command.DoGroup
                          left: <Id.KW_Do do>
                          children: [
                            (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_DollarName username))}
                                                {<Id.KW_Bang '!'> <Id.Lit_Equals '='>}
                                                {(DQ ($ Id.VSub_DollarName i))}
                                                {<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.Pipeline
                                                      negated: <Id.KW_Bang '!'>
                                                      children: [
                                                        (command.Simple
                                                          blame_tok: <Id.Left_DollarBrace '${'>
                                                          more_env: []
                                                          words: [
                                                            {(${ Id.VSub_Name PWCMD)}
                                                            {<show>}
                                                            {<group>}
                                                            {($ Id.VSub_DollarName i)}
                                                          ]
                                                          redirects: [
                                                            (Redir
                                                              op: <Id.Redir_Great '>'>
                                                              loc: (redir_loc.Fd fd:1)
                                                              arg: {<'/dev/null'>}
                                                            )
                                                            (Redir
                                                              op: <Id.Redir_GreatAnd '2>&'>
                                                              loc: (redir_loc.Fd fd:2)
                                                              arg: {<1>}
                                                            )
                                                          ]
                                                          do_fork: T
                                                        )
                                                      ]
                                                      ops: []
                                                    )
                                                  terminator: <Id.Op_Semi _>
                                                )
                                              ]
                                            )
                                          then_kw: <Id.KW_Then then>
                                          action: [
                                            (command.Simple
                                              blame_tok: <echo>
                                              more_env: []
                                              words: [
                                                {<echo>}
                                                {
                                                  (DQ <'Group '> ($ Id.VSub_DollarName i) 
                                                    <' does not exist!'>
                                                  )
                                                }
                                              ]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.ShAssignment
                                              left: <Id.Lit_VarLike '_groups_ok='>
                                              pairs: [
                                                (AssignPair
                                                  left: <Id.Lit_VarLike '_groups_ok='>
                                                  lhs: 
                                                    (sh_lhs_expr.Name
                                                      left: <Id.Lit_VarLike '_groups_ok='>
                                                      name: _groups_ok
                                                    )
                                                  op: assign_op.Equal
                                                  rhs: {<no>}
                                                )
                                              ]
                                              redirects: []
                                            )
                                          ]
                                          spids: [4355 4377]
                                        )
                                      ]
                                      else_action: []
                                      fi_kw: <Id.KW_Fi fi>
                                      redirects: []
                                    )
                                  ]
                                  spids: [4334 4352]
                                )
                              ]
                              else_action: []
                              fi_kw: <Id.KW_Fi fi>
                              redirects: []
                            )
                          ]
                          right: <Id.KW_Done done>
                        )
                      redirects: []
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.Simple
              blame_tok: <get_class>
              more_env: []
              words: [{<get_class>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <get_shell>
              more_env: []
              words: [{<get_shell>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <get_homedir>
              more_env: []
              words: [{<get_homedir>}]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <get_homeperm>
              more_env: []
              words: [{<get_homeperm>}]
              redirects: []
              do_fork: T
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <Id.Lit_Colon ':'>
                          more_env: []
                          words: [{<Id.Lit_Colon ':'>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {<-n>}
                        {
                          (DQ <'Use password-based authentication? ['> ($ Id.VSub_DollarName _usepass) 
                            <']: '>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <read>
                      more_env: []
                      words: [{<read>} {<_input>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <Id.Lit_LBracket '['>
                          more_env: []
                          words: [
                            {<Id.Lit_LBracket '['>}
                            {<-z>}
                            {(DQ ($ Id.VSub_DollarName _input))}
                            {<Id.Lit_RBracket ']'>}
                          ]
                          redirects: []
                          do_fork: T
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike '_input='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike '_input='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                              op: assign_op.Equal
                              rhs: {($ Id.VSub_DollarName _usepass)}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DAmp _>]
                    )
                    (command.Case
                      case_kw: <Id.KW_Case case>
                      to_match: (case_arg.Word w:{($ Id.VSub_DollarName _input)})
                      arms_start: <Id.KW_In in>
                      arms: [
                        (CaseArm
                          left: <Id.Lit_LBracket '['>
                          pattern: 
                            (pat.Words
                              words: [
                                {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> 
                                  <Oo> <Id.Lit_RBracket ']'>
                                }
                                {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>}
                              ]
                            )
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'passwdtype='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'passwdtype='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'passwdtype='>
                                      name: passwdtype
                                    )
                                  op: assign_op.Equal
                                  rhs: {(DQ <no>)}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                        (CaseArm
                          left: <Id.Lit_LBracket '['>
                          pattern: 
                            (pat.Words
                              words: [
                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> 
                                  <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                                }
                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> 
                                  <Ee> <Id.Lit_RBracket ']'>
                                }
                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                              ]
                            )
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.WhileUntil
                              keyword: <Id.KW_While while>
                              cond: 
                                (condition.Shell
                                  commands: [
                                    (command.Sentence
                                      child: 
                                        (command.Simple
                                          blame_tok: <Id.Lit_Colon ':'>
                                          more_env: []
                                          words: [{<Id.Lit_Colon ':'>}]
                                          redirects: []
                                          do_fork: T
                                        )
                                      terminator: <Id.Op_Semi _>
                                    )
                                  ]
                                )
                              body: 
                                (command.DoGroup
                                  left: <Id.KW_Do do>
                                  children: [
                                    (command.Simple
                                      blame_tok: <echo>
                                      more_env: []
                                      words: [
                                        {<echo>}
                                        {<-n>}
                                        {
                                          (DQ <'Use an empty password? (yes/no) ['> 
                                            ($ Id.VSub_DollarName _emptypass) <']: '>
                                          )
                                        }
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.Simple
                                      blame_tok: <read>
                                      more_env: []
                                      words: [{<read>} {<_input>}]
                                      redirects: []
                                      do_fork: T
                                    )
                                    (command.AndOr
                                      children: [
                                        (command.Simple
                                          blame_tok: <Id.Lit_LBracket '['>
                                          more_env: []
                                          words: [
                                            {<Id.Lit_LBracket '['>}
                                            {<-n>}
                                            {(DQ ($ Id.VSub_DollarName _input))}
                                            {<Id.Lit_RBracket ']'>}
                                          ]
                                          redirects: []
                                          do_fork: T
                                        )
                                        (command.ShAssignment
                                          left: <Id.Lit_VarLike '_emptypass='>
                                          pairs: [
                                            (AssignPair
                                              left: <Id.Lit_VarLike '_emptypass='>
                                              lhs: 
                                                (sh_lhs_expr.Name
                                                  left: <Id.Lit_VarLike '_emptypass='>
                                                  name: _emptypass
                                                )
                                              op: assign_op.Equal
                                              rhs: {($ Id.VSub_DollarName _input)}
                                            )
                                          ]
                                          redirects: []
                                        )
                                      ]
                                      ops: [<Id.Op_DAmp _>]
                                    )
                                    (command.Case
                                      case_kw: <Id.KW_Case case>
                                      to_match: (case_arg.Word w:{($ Id.VSub_DollarName _emptypass)})
                                      arms_start: <Id.KW_In in>
                                      arms: [
                                        (CaseArm
                                          left: <Id.Lit_LBracket '['>
                                          pattern: 
                                            (pat.Words
                                              words: [
                                                {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> 
                                                  <Id.Lit_LBracket '['> <Oo> <Id.Lit_RBracket ']'>
                                                }
                                                {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>}
                                              ]
                                            )
                                          middle: <Id.Right_CasePat _>
                                          action: [
                                            (command.Simple
                                              blame_tok: <echo>
                                              more_env: []
                                              words: [
                                                {<echo>}
                                                {<-n>}
                                                {
                                                  (DQ <'Use a random password? (yes/no) ['> 
                                                    ($ Id.VSub_DollarName _random) <']: '>
                                                  )
                                                }
                                              ]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.Simple
                                              blame_tok: <read>
                                              more_env: []
                                              words: [{<read>} {<_input>}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.AndOr
                                              children: [
                                                (command.Simple
                                                  blame_tok: <Id.Lit_LBracket '['>
                                                  more_env: []
                                                  words: [
                                                    {<Id.Lit_LBracket '['>}
                                                    {<-n>}
                                                    {(DQ ($ Id.VSub_DollarName _input))}
                                                    {<Id.Lit_RBracket ']'>}
                                                  ]
                                                  redirects: []
                                                  do_fork: T
                                                )
                                                (command.ShAssignment
                                                  left: <Id.Lit_VarLike '_random='>
                                                  pairs: [
                                                    (AssignPair
                                                      left: <Id.Lit_VarLike '_random='>
                                                      lhs: 
                                                        (sh_lhs_expr.Name
                                                          left: <Id.Lit_VarLike '_random='>
                                                          name: _random
                                                        )
                                                      op: assign_op.Equal
                                                      rhs: {(DQ ($ Id.VSub_DollarName _input))}
                                                    )
                                                  ]
                                                  redirects: []
                                                )
                                              ]
                                              ops: [<Id.Op_DAmp _>]
                                            )
                                            (command.Case
                                              case_kw: <Id.KW_Case case>
                                              to_match: 
                                                (case_arg.Word
                                                  w: {($ Id.VSub_DollarName _random)}
                                                )
                                              arms_start: <Id.KW_In in>
                                              arms: [
                                                (CaseArm
                                                  left: <Id.Lit_LBracket '['>
                                                  pattern: 
                                                    (pat.Words
                                                      words: [
                                                        {<Id.Lit_LBracket '['> <Yy> 
                                                          <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                                                        }
                                                        {<Id.Lit_LBracket '['> <Yy> 
                                                          <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'>
                                                        }
                                                        {<Id.Lit_LBracket '['> <Yy> 
                                                          <Id.Lit_RBracket ']'>
                                                        }
                                                      ]
                                                    )
                                                  middle: <Id.Right_CasePat _>
                                                  action: [
                                                    (command.ShAssignment
                                                      left: <Id.Lit_VarLike 'passwdtype='>
                                                      pairs: [
                                                        (AssignPair
                                                          left: <Id.Lit_VarLike 'passwdtype='>
                                                          lhs: 
                                                            (sh_lhs_expr.Name
                                                              left: <Id.Lit_VarLike 'passwdtype='>
                                                              name: passwdtype
                                                            )
                                                          op: assign_op.Equal
                                                          rhs: {(DQ <random>)}
                                                        )
                                                      ]
                                                      redirects: []
                                                    )
                                                    (command.ControlFlow
                                                      keyword: <Id.ControlFlow_Break break>
                                                    )
                                                  ]
                                                  right: <Id.Op_DSemi _>
                                                )
                                              ]
                                              arms_end: <Id.KW_Esac esac>
                                              redirects: []
                                            )
                                            (command.ShAssignment
                                              left: <Id.Lit_VarLike 'passwdtype='>
                                              pairs: [
                                                (AssignPair
                                                  left: <Id.Lit_VarLike 'passwdtype='>
                                                  lhs: 
                                                    (sh_lhs_expr.Name
                                                      left: <Id.Lit_VarLike 'passwdtype='>
                                                      name: passwdtype
                                                    )
                                                  op: assign_op.Equal
                                                  rhs: {(DQ <yes>)}
                                                )
                                              ]
                                              redirects: []
                                            )
                                            (command.AndOr
                                              children: [
                                                (command.Simple
                                                  blame_tok: <Id.Lit_LBracket '['>
                                                  more_env: []
                                                  words: [
                                                    {<Id.Lit_LBracket '['>}
                                                    {<-n>}
                                                    {(DQ ($ Id.VSub_DollarName configflag))}
                                                    {<Id.Lit_RBracket ']'>}
                                                  ]
                                                  redirects: []
                                                  do_fork: T
                                                )
                                                (command.ControlFlow
                                                  keyword: <Id.ControlFlow_Break break>
                                                )
                                              ]
                                              ops: [<Id.Op_DAmp _>]
                                            )
                                            (command.Simple
                                              blame_tok: <trap>
                                              more_env: []
                                              words: [
                                                {<trap>}
                                                {(SQ <'stty echo; exit'>)}
                                                {<0>}
                                                {<1>}
                                                {<2>}
                                                {<3>}
                                                {<15>}
                                              ]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.Simple
                                              blame_tok: <stty>
                                              more_env: []
                                              words: [{<stty>} {<-echo>}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.Simple
                                              blame_tok: <echo>
                                              more_env: []
                                              words: [{<echo>} {<-n>} {(DQ <'Enter password: '>)}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.Simple
                                              blame_tok: <read>
                                              more_env: []
                                              words: [{<read>} {<-r>} {<upass>}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.Simple
                                              blame_tok: <echo>
                                              more_env: []
                                              words: [{<echo> (SQ )}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.Simple
                                              blame_tok: <echo>
                                              more_env: []
                                              words: [{<echo>} {<-n>} {(DQ <'Enter password again: '>)}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.Simple
                                              blame_tok: <read>
                                              more_env: []
                                              words: [{<read>} {<-r>} {<_passconfirm>}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.Simple
                                              blame_tok: <echo>
                                              more_env: []
                                              words: [{<echo>} {(SQ )}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.Simple
                                              blame_tok: <stty>
                                              more_env: []
                                              words: [{<stty>} {<echo>}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.AndOr
                                              children: [
                                                (command.Simple
                                                  blame_tok: <Id.Lit_LBracket '['>
                                                  more_env: []
                                                  words: [
                                                    {<Id.Lit_LBracket '['>}
                                                    {<-z>}
                                                    {(DQ ($ Id.VSub_DollarName upass))}
                                                    {<-a>}
                                                    {<-z>}
                                                    {(DQ ($ Id.VSub_DollarName _passconfirm))}
                                                    {<Id.Lit_RBracket ']'>}
                                                  ]
                                                  redirects: []
                                                  do_fork: T
                                                )
                                                (command.ControlFlow
                                                  keyword: <Id.ControlFlow_Continue continue>
                                                )
                                              ]
                                              ops: [<Id.Op_DAmp _>]
                                            )
                                          ]
                                          right: <Id.Op_DSemi _>
                                        )
                                        (CaseArm
                                          left: <Id.Lit_LBracket '['>
                                          pattern: 
                                            (pat.Words
                                              words: [
                                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> 
                                                  <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                                                }
                                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> 
                                                  <Id.Lit_LBracket '['> <Ee> <Id.Lit_RBracket ']'>
                                                }
                                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                                              ]
                                            )
                                          middle: <Id.Right_CasePat _>
                                          action: [
                                            (command.ShAssignment
                                              left: <Id.Lit_VarLike 'passwdtype='>
                                              pairs: [
                                                (AssignPair
                                                  left: <Id.Lit_VarLike 'passwdtype='>
                                                  lhs: 
                                                    (sh_lhs_expr.Name
                                                      left: <Id.Lit_VarLike 'passwdtype='>
                                                      name: passwdtype
                                                    )
                                                  op: assign_op.Equal
                                                  rhs: {(DQ <none>)}
                                                )
                                              ]
                                              redirects: []
                                            )
                                            (command.Sentence
                                              child: 
                                                (command.ControlFlow
                                                  keyword: <Id.ControlFlow_Break break>
                                                )
                                              terminator: <Id.Op_Semi _>
                                            )
                                          ]
                                          right: <Id.Op_DSemi _>
                                        )
                                        (CaseArm
                                          left: <Id.Lit_Star '*'>
                                          pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                                          middle: <Id.Right_CasePat _>
                                          action: [
                                            (command.ControlFlow
                                              keyword: <Id.ControlFlow_Continue continue>
                                            )
                                          ]
                                          right: <Id.Op_DSemi _>
                                        )
                                      ]
                                      arms_end: <Id.KW_Esac esac>
                                      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_DollarName upass))}
                                                        {<Id.KW_Bang '!'> <Id.Lit_Equals '='>}
                                                        {(DQ ($ Id.VSub_DollarName _passconfirm))}
                                                        {<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>} {(DQ <'Passwords did not match!'>)}]
                                              redirects: []
                                              do_fork: T
                                            )
                                            (command.ControlFlow
                                              keyword: <Id.ControlFlow_Continue continue>
                                            )
                                          ]
                                          spids: [4832 4850]
                                        )
                                      ]
                                      else_action: []
                                      fi_kw: <Id.KW_Fi fi>
                                      redirects: []
                                    )
                                    (command.ControlFlow
                                      keyword: <Id.ControlFlow_Break break>
                                    )
                                  ]
                                  right: <Id.KW_Done done>
                                )
                              redirects: []
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                        (CaseArm
                          left: <Id.Lit_Star '*'>
                          pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                          middle: <Id.Right_CasePat _>
                          action: [(command.ControlFlow keyword:<Id.ControlFlow_Continue continue>)]
                          right: <Id.Op_DSemi _>
                        )
                      ]
                      arms_end: <Id.KW_Esac esac>
                      redirects: []
                    )
                    (command.Sentence
                      child: (command.ControlFlow keyword:<Id.ControlFlow_Break break>)
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_disable='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_disable='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_disable='> name:_disable)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name disableflag>
                        var_name: disableflag
                        suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:{(DQ <no>)})
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <Id.Lit_Colon ':'>
                          more_env: []
                          words: [{<Id.Lit_Colon ':'>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [
                        {<echo>}
                        {<-n>}
                        {
                          (DQ <'Lock out the account after creation? ['> 
                            ($ Id.VSub_DollarName _disable) <']: '>
                          )
                        }
                      ]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <read>
                      more_env: []
                      words: [{<read>} {<_input>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <Id.Lit_LBracket '['>
                          more_env: []
                          words: [
                            {<Id.Lit_LBracket '['>}
                            {<-z>}
                            {(DQ ($ Id.VSub_DollarName _input))}
                            {<Id.Lit_RBracket ']'>}
                          ]
                          redirects: []
                          do_fork: T
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike '_input='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike '_input='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_input='> name:_input)
                              op: assign_op.Equal
                              rhs: {($ Id.VSub_DollarName _disable)}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DAmp _>]
                    )
                    (command.Case
                      case_kw: <Id.KW_Case case>
                      to_match: (case_arg.Word w:{($ Id.VSub_DollarName _input)})
                      arms_start: <Id.KW_In in>
                      arms: [
                        (CaseArm
                          left: <Id.Lit_LBracket '['>
                          pattern: 
                            (pat.Words
                              words: [
                                {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> 
                                  <Oo> <Id.Lit_RBracket ']'>
                                }
                                {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>}
                              ]
                            )
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'disableflag='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'disableflag='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'disableflag='>
                                      name: disableflag
                                    )
                                  op: assign_op.Equal
                                  rhs: (rhs_word__Empty)
                                )
                              ]
                              redirects: []
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                        (CaseArm
                          left: <Id.Lit_LBracket '['>
                          pattern: 
                            (pat.Words
                              words: [
                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> 
                                  <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                                }
                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> 
                                  <Ee> <Id.Lit_RBracket ']'>
                                }
                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                              ]
                            )
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'disableflag='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'disableflag='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'disableflag='>
                                      name: disableflag
                                    )
                                  op: assign_op.Equal
                                  rhs: {<yes>}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                        (CaseArm
                          left: <Id.Lit_Star '*'>
                          pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                          middle: <Id.Right_CasePat _>
                          action: [(command.ControlFlow keyword:<Id.ControlFlow_Continue continue>)]
                          right: <Id.Op_DSemi _>
                        )
                      ]
                      arms_end: <Id.KW_Esac esac>
                      redirects: []
                    )
                    (command.ControlFlow keyword:<Id.ControlFlow_Break break>)
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.ShAssignment
              left: <Id.Lit_VarLike '_disable='>
              pairs: [
                (AssignPair
                  left: <Id.Lit_VarLike '_disable='>
                  lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_disable='> name:_disable)
                  op: assign_op.Equal
                  rhs: 
                    {
                      (BracedVarSub
                        left: <Id.Left_DollarBrace '${'>
                        token: <Id.VSub_Name disableflag>
                        var_name: disableflag
                        suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:{(DQ <no>)})
                        right: <Id.Right_DollarBrace '}'>
                      )
                    }
                )
              ]
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-z>}
                    {(DQ ($ Id.VSub_DollarName configflag))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.Simple
                  blame_tok: <printf>
                  more_env: []
                  words: [
                    {<printf>}
                    {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                    {<Username>}
                    {($ Id.VSub_DollarName username)}
                  ]
                  redirects: []
                  do_fork: T
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.Case
              case_kw: <Id.KW_Case case>
              to_match: (case_arg.Word w:{($ Id.VSub_DollarName passwdtype)})
              arms_start: <Id.KW_In in>
              arms: [
                (CaseArm
                  left: <yes>
                  pattern: (pat.Words words:[{<yes>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_pass='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_pass='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pass='> name:_pass)
                          op: assign_op.Equal
                          rhs: {(SQ <'*****'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <no>
                  pattern: (pat.Words words:[{<no>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_pass='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_pass='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pass='> name:_pass)
                          op: assign_op.Equal
                          rhs: {(SQ <'<disabled>'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <none>
                  pattern: (pat.Words words:[{<none>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_pass='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_pass='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pass='> name:_pass)
                          op: assign_op.Equal
                          rhs: {(SQ <'<blank>'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <random>
                  pattern: (pat.Words words:[{<random>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike '_pass='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike '_pass='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike '_pass='> name:_pass)
                          op: assign_op.Equal
                          rhs: {(SQ <'<random>'>)}
                        )
                      ]
                      redirects: []
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
              ]
              arms_end: <Id.KW_Esac esac>
              redirects: []
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-z>}
                    {(DQ ($ Id.VSub_DollarName configflag))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.Simple
                  blame_tok: <printf>
                  more_env: []
                  words: [
                    {<printf>}
                    {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                    {(DQ <Password>)}
                    {(DQ ($ Id.VSub_DollarName _pass))}
                  ]
                  redirects: []
                  do_fork: T
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-n>}
                    {(DQ ($ Id.VSub_DollarName configflag))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.Simple
                  blame_tok: <printf>
                  more_env: []
                  words: [
                    {<printf>}
                    {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                    {(DQ <'Pass Type'>)}
                    {(DQ ($ Id.VSub_DollarName passwdtype))}
                  ]
                  redirects: []
                  do_fork: T
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-z>}
                    {(DQ ($ Id.VSub_DollarName configflag))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.Simple
                  blame_tok: <printf>
                  more_env: []
                  words: [
                    {<printf>}
                    {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                    {(DQ <'Full Name'>)}
                    {(DQ ($ Id.VSub_DollarName ugecos))}
                  ]
                  redirects: []
                  do_fork: T
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.AndOr
              children: [
                (command.Simple
                  blame_tok: <Id.Lit_LBracket '['>
                  more_env: []
                  words: [
                    {<Id.Lit_LBracket '['>}
                    {<-z>}
                    {(DQ ($ Id.VSub_DollarName configflag))}
                    {<Id.Lit_RBracket ']'>}
                  ]
                  redirects: []
                  do_fork: T
                )
                (command.Simple
                  blame_tok: <printf>
                  more_env: []
                  words: [
                    {<printf>}
                    {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                    {(DQ <Uid>)}
                    {(DQ ($ Id.VSub_DollarName uuid))}
                  ]
                  redirects: []
                  do_fork: T
                )
              ]
              ops: [<Id.Op_DAmp _>]
            )
            (command.Simple
              blame_tok: <printf>
              more_env: []
              words: [
                {<printf>}
                {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                {(DQ <Class>)}
                {(DQ ($ Id.VSub_DollarName uclass))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <printf>
              more_env: []
              words: [
                {<printf>}
                {(DQ <'%-10s : %s %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                {(DQ <Groups>)}
                {
                  (DQ 
                    (BracedVarSub
                      left: <Id.Left_DollarBrace '${'>
                      token: <Id.VSub_Name ulogingroup>
                      var_name: ulogingroup
                      suffix_op: 
                        (suffix_op.Unary
                          op: <Id.VTest_ColonHyphen _>
                          arg_word: {($ Id.VSub_DollarName username)}
                        )
                      right: <Id.Right_DollarBrace '}'>
                    )
                  )
                }
                {(DQ ($ Id.VSub_DollarName ugroups))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <printf>
              more_env: []
              words: [
                {<printf>}
                {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                {(DQ <Home>)}
                {(DQ ($ Id.VSub_DollarName uhome))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <printf>
              more_env: []
              words: [
                {<printf>}
                {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                {(DQ <'Home Mode'>)}
                {(DQ ($ Id.VSub_DollarName uhomeperm))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <printf>
              more_env: []
              words: [
                {<printf>}
                {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                {(DQ <Shell>)}
                {(DQ ($ Id.VSub_DollarName ushell))}
              ]
              redirects: []
              do_fork: T
            )
            (command.Simple
              blame_tok: <printf>
              more_env: []
              words: [
                {<printf>}
                {(DQ <'%-10s : %s'> <Id.Lit_BadBackslash '\\'> <n>)}
                {(DQ <Locked>)}
                {(DQ ($ Id.VSub_DollarName _disable))}
              ]
              redirects: []
              do_fork: T
            )
            (command.WhileUntil
              keyword: <Id.KW_While while>
              cond: 
                (condition.Shell
                  commands: [
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <Id.Lit_Colon ':'>
                          more_env: []
                          words: [{<Id.Lit_Colon ':'>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                )
              body: 
                (command.DoGroup
                  left: <Id.KW_Do do>
                  children: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {<-n>} {(DQ <'OK? (yes/no): '>)}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Simple
                      blame_tok: <read>
                      more_env: []
                      words: [{<read>} {<_input>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.Case
                      case_kw: <Id.KW_Case case>
                      to_match: (case_arg.Word w:{($ Id.VSub_DollarName _input)})
                      arms_start: <Id.KW_In in>
                      arms: [
                        (CaseArm
                          left: <Id.Lit_LBracket '['>
                          pattern: 
                            (pat.Words
                              words: [
                                {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> 
                                  <Oo> <Id.Lit_RBracket ']'>
                                }
                                {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>}
                              ]
                            )
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.ControlFlow
                              keyword: <Id.ControlFlow_Return return>
                              arg_word: {<1>}
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                        (CaseArm
                          left: <Id.Lit_LBracket '['>
                          pattern: 
                            (pat.Words
                              words: [
                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> 
                                  <Ee> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                                }
                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> 
                                  <Ee> <Id.Lit_RBracket ']'>
                                }
                                {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                              ]
                            )
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.Simple
                              blame_tok: <add_user>
                              more_env: []
                              words: [{<add_user>}]
                              redirects: []
                              do_fork: T
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                        (CaseArm
                          left: <Id.Lit_Star '*'>
                          pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                          middle: <Id.Right_CasePat _>
                          action: [(command.ControlFlow keyword:<Id.ControlFlow_Continue continue>)]
                          right: <Id.Op_DSemi _>
                        )
                      ]
                      arms_end: <Id.KW_Esac esac>
                      redirects: []
                    )
                    (command.ControlFlow keyword:<Id.ControlFlow_Break break>)
                  ]
                  right: <Id.KW_Done done>
                )
              redirects: []
            )
            (command.ControlFlow keyword:<Id.ControlFlow_Return return> arg_word:{<0>})
          ]
          redirects: []
          right: <Id.Lit_RBrace '}'>
        )
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'THISCMD='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'THISCMD='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'THISCMD='> name:THISCMD)
          op: assign_op.Equal
          rhs: 
            {
              (CommandSub
                left_token: <Id.Left_Backtick '`'>
                child: 
                  (command.Simple
                    blame_tok: <'/usr/bin/basename'>
                    more_env: []
                    words: [{<'/usr/bin/basename'>} {($ Id.VSub_Number 0)}]
                    redirects: []
                    do_fork: T
                  )
                right: <Id.Backtick_Right '`'>
              )
            }
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'DEFAULTSHELL='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'DEFAULTSHELL='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'DEFAULTSHELL='> name:DEFAULTSHELL)
          op: assign_op.Equal
          rhs: {<'/bin/sh'>}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'ADDUSERCONF='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'ADDUSERCONF='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ADDUSERCONF='> name:ADDUSERCONF)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (BracedVarSub
                  left: <Id.Left_DollarBrace '${'>
                  token: <Id.VSub_Name ADDUSERCONF>
                  var_name: ADDUSERCONF
                  suffix_op: 
                    (suffix_op.Unary
                      op: <Id.VTest_ColonHyphen _>
                      arg_word: {<Id.Lit_Slash '/'> <etc> <Id.Lit_Slash '/'> <adduser.conf>}
                    )
                  right: <Id.Right_DollarBrace '}'>
                )
              )
            }
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'PWCMD='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'PWCMD='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'PWCMD='> name:PWCMD)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (BracedVarSub
                  left: <Id.Left_DollarBrace '${'>
                  token: <Id.VSub_Name PWCMD>
                  var_name: PWCMD
                  suffix_op: 
                    (suffix_op.Unary
                      op: <Id.VTest_ColonHyphen _>
                      arg_word: 
                        {<Id.Lit_Slash '/'> <usr> <Id.Lit_Slash '/'> <sbin> <Id.Lit_Slash '/'> <pw>}
                    )
                  right: <Id.Right_DollarBrace '}'>
                )
              )
            }
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'MAILCMD='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'MAILCMD='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'MAILCMD='> name:MAILCMD)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (BracedVarSub
                  left: <Id.Left_DollarBrace '${'>
                  token: <Id.VSub_Name MAILCMD>
                  var_name: MAILCMD
                  suffix_op: (suffix_op.Unary op:<Id.VTest_ColonHyphen _> arg_word:{<mail>})
                  right: <Id.Right_DollarBrace '}'>
                )
              )
            }
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'ETCSHELLS='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'ETCSHELLS='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ETCSHELLS='> name:ETCSHELLS)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (BracedVarSub
                  left: <Id.Left_DollarBrace '${'>
                  token: <Id.VSub_Name ETCSHELLS>
                  var_name: ETCSHELLS
                  suffix_op: 
                    (suffix_op.Unary
                      op: <Id.VTest_ColonHyphen _>
                      arg_word: {<Id.Lit_Slash '/'> <etc> <Id.Lit_Slash '/'> <shells>}
                    )
                  right: <Id.Right_DollarBrace '}'>
                )
              )
            }
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'NOHOME='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'NOHOME='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'NOHOME='> name:NOHOME)
          op: assign_op.Equal
          rhs: {(DQ <'/nonexistent'>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'NOLOGIN='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'NOLOGIN='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'NOLOGIN='> name:NOLOGIN)
          op: assign_op.Equal
          rhs: {(DQ <nologin>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'NOLOGIN_PATH='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'NOLOGIN_PATH='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'NOLOGIN_PATH='> name:NOLOGIN_PATH)
          op: assign_op.Equal
          rhs: {(DQ <'/usr/sbin/nologin'>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'GREPCMD='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'GREPCMD='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'GREPCMD='> name:GREPCMD)
          op: assign_op.Equal
          rhs: {(DQ <'/usr/bin/grep'>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'DATECMD='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'DATECMD='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'DATECMD='> name:DATECMD)
          op: assign_op.Equal
          rhs: {(DQ <'/bin/date'>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'username='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'username='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'username='> name:username)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'uuid='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'uuid='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uuid='> name:uuid)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'uidstart='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'uidstart='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uidstart='> name:uidstart)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'ugecos='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'ugecos='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ugecos='> name:ugecos)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'ulogingroup='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'ulogingroup='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ulogingroup='> name:ulogingroup)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'uclass='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'uclass='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uclass='> name:uclass)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'uhome='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'uhome='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhome='> name:uhome)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'uhomeperm='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'uhomeperm='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uhomeperm='> name:uhomeperm)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'upass='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'upass='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'upass='> name:upass)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'ushell='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'ushell='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ushell='> name:ushell)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'udotdir='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'udotdir='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'udotdir='> name:udotdir)
          op: assign_op.Equal
          rhs: {<'/usr/share/skel'>}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'ugroups='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'ugroups='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'ugroups='> name:ugroups)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'uexpire='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'uexpire='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uexpire='> name:uexpire)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'upwexpire='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'upwexpire='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'upwexpire='> name:upwexpire)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'shells='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'shells='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'shells='> name:shells)
          op: assign_op.Equal
          rhs: 
            {
              (DQ 
                (CommandSub
                  left_token: <Id.Left_Backtick '`'>
                  child: 
                    (command.Simple
                      blame_tok: <valid_shells>
                      more_env: []
                      words: [{<valid_shells>}]
                      redirects: []
                      do_fork: T
                    )
                  right: <Id.Backtick_Right '`'>
                )
              )
            }
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'passwdtype='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'passwdtype='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'passwdtype='> name:passwdtype)
          op: assign_op.Equal
          rhs: {(DQ <yes>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'msgfile='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'msgfile='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'msgfile='> name:msgfile)
          op: assign_op.Equal
          rhs: {<'/etc/adduser.msg'>}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'msgflag='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'msgflag='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'msgflag='> name:msgflag)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'quietflag='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'quietflag='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'quietflag='> name:quietflag)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'configflag='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'configflag='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'configflag='> name:configflag)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'fflag='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'fflag='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'fflag='> name:fflag)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'infile='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'infile='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'infile='> name:infile)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'disableflag='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'disableflag='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'disableflag='> name:disableflag)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'Dflag='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'Dflag='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'Dflag='> name:Dflag)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'Sflag='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'Sflag='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'Sflag='> name:Sflag)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'readconfig='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'readconfig='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'readconfig='> name:readconfig)
          op: assign_op.Equal
          rhs: {(DQ <yes>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'homeprefix='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'homeprefix='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'homeprefix='> name:homeprefix)
          op: assign_op.Equal
          rhs: {(DQ <'/home'>)}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'randompass='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'randompass='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'randompass='> name:randompass)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'fileline='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'fileline='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'fileline='> name:fileline)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'savedpwtype='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'savedpwtype='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'savedpwtype='> name:savedpwtype)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'defaultclass='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'defaultclass='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'defaultclass='> name:defaultclass)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'defaultLgroup='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'defaultLgroup='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'defaultLgroup='> name:defaultLgroup)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'defaultgroups='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'defaultgroups='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'defaultgroups='> name:defaultgroups)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'defaultshell='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'defaultshell='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'defaultshell='> name:defaultshell)
          op: assign_op.Equal
          rhs: {(DQ (${ Id.VSub_Name DEFAULTSHELL))}
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'defaultHomePerm='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'defaultHomePerm='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'defaultHomePerm='> name:defaultHomePerm)
          op: assign_op.Equal
          rhs: (rhs_word__Empty)
        )
      ]
      redirects: []
    )
    (command.ShAssignment
      left: <Id.Lit_VarLike 'procowner='>
      pairs: [
        (AssignPair
          left: <Id.Lit_VarLike 'procowner='>
          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'procowner='> name:procowner)
          op: assign_op.Equal
          rhs: 
            {
              (BracedVarSub
                left: <Id.Left_DollarBrace '${'>
                token: <Id.VSub_Name procowner>
                var_name: procowner
                suffix_op: 
                  (suffix_op.Unary
                    op: <Id.VTest_ColonHyphen _>
                    arg_word: 
                      {
                        (CommandSub
                          left_token: <Id.Left_Backtick '`'>
                          child: 
                            (command.Simple
                              blame_tok: <'/usr/bin/id'>
                              more_env: []
                              words: [{<'/usr/bin/id'>} {<-u>}]
                              redirects: []
                              do_fork: T
                            )
                          right: <Id.Backtick_Right '`'>
                        )
                      }
                  )
                right: <Id.Right_DollarBrace '}'>
              )
            }
        )
      ]
      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_DollarName procowner))}
                        {<Id.KW_Bang '!'> <Id.Lit_Equals '='>}
                        {(DQ <0>)}
                        {<Id.Lit_RBracket ']'>}
                      ]
                      redirects: []
                      do_fork: T
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          then_kw: <Id.KW_Then then>
          action: [
            (command.Simple
              blame_tok: <err>
              more_env: []
              words: [{<err>} {(SQ <'you must be the super-user (uid 0) to use this utility.'>)}]
              redirects: []
              do_fork: T
            )
            (command.ControlFlow keyword:<Id.ControlFlow_Exit exit> arg_word:{<1>})
          ]
          spids: [5686 5704]
        )
      ]
      else_action: []
      fi_kw: <Id.KW_Fi fi>
      redirects: []
    )
    (command.ForEach
      keyword: <Id.KW_For for>
      iter_names: [_i]
      iterable: (for_iter.Words words:[{($ Id.VSub_Star '*')}])
      semi_tok: <Id.Op_Semi _>
      body: 
        (command.DoGroup
          left: <Id.KW_Do do>
          children: [
            (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_DollarName _i))}
                                {<Id.Lit_Equals '='>}
                                {(DQ <-N>)}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'readconfig='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'readconfig='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'readconfig='> name:readconfig)
                          op: assign_op.Equal
                          rhs: (rhs_word__Empty)
                        )
                      ]
                      redirects: []
                    )
                    (command.Sentence
                      child: (command.ControlFlow keyword:<Id.ControlFlow_Break break>)
                      terminator: <Id.Op_Semi _>
                    )
                  ]
                  spids: [5752 5769]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          right: <Id.KW_Done done>
        )
      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 '['>}
                        {<-n>}
                        {(DQ ($ Id.VSub_DollarName readconfig))}
                        {<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.Subshell
                              left: <Id.Op_LParen _>
                              child: 
                                (command.Simple
                                  blame_tok: <.>
                                  more_env: []
                                  words: [{<.>} {(${ Id.VSub_Name ADDUSERCONF)}]
                                  redirects: [
                                    (Redir
                                      op: <Id.Redir_Great '>'>
                                      loc: (redir_loc.Fd fd:1)
                                      arg: {<'/dev/null'>}
                                    )
                                    (Redir
                                      op: <Id.Redir_GreatAnd '2>&'>
                                      loc: (redir_loc.Fd fd:2)
                                      arg: {<1>}
                                    )
                                  ]
                                  do_fork: T
                                )
                              right: <Id.Right_Subshell _>
                              redirects: []
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <Id.Lit_LBracket '['>
                          more_env: []
                          words: [
                            {<Id.Lit_LBracket '['>}
                            {<-r>}
                            {(${ Id.VSub_Name ADDUSERCONF)}
                            {<Id.Lit_RBracket ']'>}
                          ]
                          redirects: []
                          do_fork: T
                        )
                        (command.Simple
                          blame_tok: <.>
                          more_env: []
                          words: [{<.>} {(${ Id.VSub_Name ADDUSERCONF)}]
                          redirects: [
                            (Redir
                              op: <Id.Redir_Great '>'>
                              loc: (redir_loc.Fd fd:1)
                              arg: {<'/dev/null'>}
                            )
                            (Redir
                              op: <Id.Redir_GreatAnd '2>&'>
                              loc: (redir_loc.Fd fd:2)
                              arg: {<1>}
                            )
                          ]
                          do_fork: T
                        )
                      ]
                      ops: [<Id.Op_DAmp _>]
                    )
                  ]
                  spids: [5807 5827]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          spids: [5783 5796]
        )
      ]
      else_action: []
      fi_kw: <Id.KW_Fi fi>
      redirects: []
    )
    (command.ForEach
      keyword: <Id.KW_For for>
      iter_names: [_switch]
      iterable: (for_iter__Args)
      body: 
        (command.DoGroup
          left: <Id.KW_Do do>
          children: [
            (command.Case
              case_kw: <Id.KW_Case case>
              to_match: (case_arg.Word w:{($ Id.VSub_DollarName _switch)})
              arms_start: <Id.KW_In in>
              arms: [
                (CaseArm
                  left: <-L>
                  pattern: (pat.Words words:[{<-L>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'defaultclass='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'defaultclass='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'defaultclass='>
                              name: defaultclass
                            )
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number 2))}
                        )
                      ]
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-C>
                  pattern: (pat.Words words:[{<-C>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'configflag='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'configflag='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'configflag='> name:configflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-D>
                  pattern: (pat.Words words:[{<-D>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'Dflag='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'Dflag='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'Dflag='> name:Dflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-E>
                  pattern: (pat.Words words:[{<-E>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'disableflag='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'disableflag='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'disableflag='>
                              name: disableflag
                            )
                          op: assign_op.Equal
                          rhs: {<yes>}
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-k>
                  pattern: (pat.Words words:[{<-k>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'udotdir='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'udotdir='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'udotdir='> name:udotdir)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number 2))}
                        )
                      ]
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-f>
                  pattern: (pat.Words words:[{<-f>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.AndOr
                      children: [
                        (command.Simple
                          blame_tok: <Id.Lit_LBracket '['>
                          more_env: []
                          words: [
                            {<Id.Lit_LBracket '['>}
                            {(DQ ($ Id.VSub_Number 2))}
                            {<Id.KW_Bang '!'> <Id.Lit_Equals '='>}
                            {(DQ <->)}
                            {<Id.Lit_RBracket ']'>}
                          ]
                          redirects: []
                          do_fork: T
                        )
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'infile='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'infile='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'infile='> name:infile)
                              op: assign_op.Equal
                              rhs: {(DQ ($ Id.VSub_Number 2))}
                            )
                          ]
                          redirects: []
                        )
                      ]
                      ops: [<Id.Op_DAmp _>]
                    )
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'fflag='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'fflag='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'fflag='> name:fflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                        )
                      ]
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-g>
                  pattern: (pat.Words words:[{<-g>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'defaultLgroup='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'defaultLgroup='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'defaultLgroup='>
                              name: defaultLgroup
                            )
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number 2))}
                        )
                      ]
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-G>
                  pattern: (pat.Words words:[{<-G>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'defaultgroups='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'defaultgroups='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'defaultgroups='>
                              name: defaultgroups
                            )
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number 2))}
                        )
                      ]
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-h>
                  pattern: (pat.Words words:[{<-h>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.Simple
                      blame_tok: <show_usage>
                      more_env: []
                      words: [{<show_usage>}]
                      redirects: []
                      do_fork: T
                    )
                    (command.ControlFlow
                      keyword: <Id.ControlFlow_Exit exit>
                      arg_word: {<0>}
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-d>
                  pattern: (pat.Words words:[{<-d>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'homeprefix='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'homeprefix='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'homeprefix='> name:homeprefix)
                          op: assign_op.Equal
                          rhs: {(DQ ($ Id.VSub_Number 2))}
                        )
                      ]
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-m>
                  pattern: (pat.Words words:[{<-m>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.Case
                      case_kw: <Id.KW_Case case>
                      to_match: (case_arg.Word w:{(DQ ($ Id.VSub_Number 2))})
                      arms_start: <Id.KW_In in>
                      arms: [
                        (CaseArm
                          left: <Id.Lit_LBracket '['>
                          pattern: 
                            (pat.Words
                              words: [
                                {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> 
                                  <Oo> <Id.Lit_RBracket ']'>
                                }
                              ]
                            )
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'msgflag='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'msgflag='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'msgflag='>
                                      name: msgflag
                                    )
                                  op: assign_op.Equal
                                  rhs: (rhs_word__Empty)
                                )
                              ]
                              redirects: []
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                        (CaseArm
                          left: <Id.Lit_Star '*'>
                          pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'msgflag='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'msgflag='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'msgflag='>
                                      name: msgflag
                                    )
                                  op: assign_op.Equal
                                  rhs: {<yes>}
                                )
                              ]
                              redirects: []
                            )
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'msgfile='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'msgfile='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'msgfile='>
                                      name: msgfile
                                    )
                                  op: assign_op.Equal
                                  rhs: {(DQ ($ Id.VSub_Number 2))}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                      ]
                      arms_end: <Id.KW_Esac esac>
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-M>
                  pattern: (pat.Words words:[{<-M>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'defaultHomePerm='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'defaultHomePerm='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'defaultHomePerm='>
                              name: defaultHomePerm
                            )
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number 2)}
                        )
                      ]
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-N>
                  pattern: (pat.Words words:[{<-N>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'readconfig='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'readconfig='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'readconfig='> name:readconfig)
                          op: assign_op.Equal
                          rhs: (rhs_word__Empty)
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-w>
                  pattern: (pat.Words words:[{<-w>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.Case
                      case_kw: <Id.KW_Case case>
                      to_match: (case_arg.Word w:{(DQ ($ Id.VSub_Number 2))})
                      arms_start: <Id.KW_In in>
                      arms: [
                        (CaseArm
                          left: <no>
                          pattern: (pat.Words words:[{<no>} {<none>} {<random>} {<yes>}])
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.ShAssignment
                              left: <Id.Lit_VarLike 'passwdtype='>
                              pairs: [
                                (AssignPair
                                  left: <Id.Lit_VarLike 'passwdtype='>
                                  lhs: 
                                    (sh_lhs_expr.Name
                                      left: <Id.Lit_VarLike 'passwdtype='>
                                      name: passwdtype
                                    )
                                  op: assign_op.Equal
                                  rhs: {($ Id.VSub_Number 2)}
                                )
                              ]
                              redirects: []
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                        (CaseArm
                          left: <Id.Lit_Star '*'>
                          pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                          middle: <Id.Right_CasePat _>
                          action: [
                            (command.Simple
                              blame_tok: <show_usage>
                              more_env: []
                              words: [{<show_usage>}]
                              redirects: []
                              do_fork: T
                            )
                            (command.ControlFlow
                              keyword: <Id.ControlFlow_Exit exit>
                              arg_word: {<1>}
                            )
                          ]
                          right: <Id.Op_DSemi _>
                        )
                      ]
                      arms_end: <Id.KW_Esac esac>
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-q>
                  pattern: (pat.Words words:[{<-q>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'quietflag='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'quietflag='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'quietflag='> name:quietflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-s>
                  pattern: (pat.Words words:[{<-s>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'defaultshell='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'defaultshell='>
                          lhs: 
                            (sh_lhs_expr.Name
                              left: <Id.Lit_VarLike 'defaultshell='>
                              name: defaultshell
                            )
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ 
                                (CommandSub
                                  left_token: <Id.Left_Backtick '`'>
                                  child: 
                                    (command.Simple
                                      blame_tok: <fullpath_from_shell>
                                      more_env: []
                                      words: [{<fullpath_from_shell>} {($ Id.VSub_Number 2)}]
                                      redirects: []
                                      do_fork: T
                                    )
                                  right: <Id.Backtick_Right '`'>
                                )
                              )
                            }
                        )
                      ]
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-S>
                  pattern: (pat.Words words:[{<-S>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'Sflag='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'Sflag='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'Sflag='> name:Sflag)
                          op: assign_op.Equal
                          rhs: {<yes>}
                        )
                      ]
                      redirects: []
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
                (CaseArm
                  left: <-u>
                  pattern: (pat.Words words:[{<-u>}])
                  middle: <Id.Right_CasePat _>
                  action: [
                    (command.ShAssignment
                      left: <Id.Lit_VarLike 'uidstart='>
                      pairs: [
                        (AssignPair
                          left: <Id.Lit_VarLike 'uidstart='>
                          lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uidstart='> name:uidstart)
                          op: assign_op.Equal
                          rhs: {($ Id.VSub_Number 2)}
                        )
                      ]
                      redirects: []
                    )
                    (command.Sentence
                      child: 
                        (command.Simple
                          blame_tok: <shift>
                          more_env: []
                          words: [{<shift>}]
                          redirects: []
                          do_fork: T
                        )
                      terminator: <Id.Op_Semi _>
                    )
                    (command.Simple
                      blame_tok: <shift>
                      more_env: []
                      words: [{<shift>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  right: <Id.Op_DSemi _>
                )
              ]
              arms_end: <Id.KW_Esac esac>
              redirects: []
            )
          ]
          right: <Id.KW_Done done>
        )
      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 '['>}
                        {<-n>}
                        {(DQ ($ Id.VSub_DollarName fflag))}
                        {<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 '['>}
                                {<-z>}
                                {(DQ ($ Id.VSub_DollarName infile))}
                                {<Id.Lit_RBracket ']'>}
                              ]
                              redirects: []
                              do_fork: T
                            )
                          terminator: <Id.Op_Semi _>
                        )
                      ]
                    )
                  then_kw: <Id.KW_Then then>
                  action: [
                    (command.Simple
                      blame_tok: <input_from_file>
                      more_env: []
                      words: [{<input_from_file>}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  spids: [6320 6333]
                )
                (IfArm
                  keyword: <Id.KW_Elif elif>
                  cond: 
                    (condition.Shell
                      commands: [
                        (command.Sentence
                          child: 
                            (command.Simple
                              blame_tok: <Id.Lit_LBracket '['>
                              more_env: []
                              words: [
                                {<Id.Lit_LBracket '['>}
                                {<-n>}
                                {(DQ ($ Id.VSub_DollarName infile))}
                                {<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 '['>}
                                        {<-r>}
                                        {(DQ ($ Id.VSub_DollarName infile))}
                                        {<Id.Lit_RBracket ']'>}
                                      ]
                                      redirects: []
                                      do_fork: T
                                    )
                                  terminator: <Id.Op_Semi _>
                                )
                              ]
                            )
                          then_kw: <Id.KW_Then then>
                          action: [
                            (command.Simple
                              blame_tok: <input_from_file>
                              more_env: []
                              words: [{<input_from_file>}]
                              redirects: [
                                (Redir
                                  op: <Id.Redir_Less '<'>
                                  loc: (redir_loc.Fd fd:0)
                                  arg: {($ Id.VSub_DollarName infile)}
                                )
                              ]
                              do_fork: T
                            )
                          ]
                          spids: [6355 6368]
                        )
                      ]
                      else_kw: <Id.KW_Else else>
                      else_action: [
                        (command.Simple
                          blame_tok: <err>
                          more_env: []
                          words: [
                            {<err>}
                            {
                              (DQ <'File ('> ($ Id.VSub_DollarName infile) 
                                <') is unreadable or does not exist.'>
                              )
                            }
                          ]
                          redirects: []
                          do_fork: T
                        )
                      ]
                      fi_kw: <Id.KW_Fi fi>
                      redirects: []
                    )
                  ]
                  spids: [6339 6352]
                )
              ]
              else_action: []
              fi_kw: <Id.KW_Fi fi>
              redirects: []
            )
          ]
          spids: [6304 6317]
        )
      ]
      else_kw: <Id.KW_Else else>
      else_action: [
        (command.Simple
          blame_tok: <input_interactive>
          more_env: []
          words: [{<input_interactive>}]
          redirects: []
          do_fork: T
        )
        (command.WhileUntil
          keyword: <Id.KW_While while>
          cond: 
            (condition.Shell
              commands: [
                (command.Sentence
                  child: 
                    (command.Simple
                      blame_tok: <Id.Lit_Colon ':'>
                      more_env: []
                      words: [{<Id.Lit_Colon ':'>}]
                      redirects: []
                      do_fork: T
                    )
                  terminator: <Id.Op_Semi _>
                )
              ]
            )
          body: 
            (command.DoGroup
              left: <Id.KW_Do do>
              children: [
                (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 '['>}
                                    {<-z>}
                                    {(DQ ($ Id.VSub_DollarName configflag))}
                                    {<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>} {<-n>} {(DQ <'Add another user? (yes/no): '>)}]
                          redirects: []
                          do_fork: T
                        )
                      ]
                      spids: [6410 6423]
                    )
                  ]
                  else_kw: <Id.KW_Else else>
                  else_action: [
                    (command.Simple
                      blame_tok: <echo>
                      more_env: []
                      words: [{<echo>} {<-n>} {(DQ <'Re-edit the default configuration? (yes/no): '>)}]
                      redirects: []
                      do_fork: T
                    )
                  ]
                  fi_kw: <Id.KW_Fi fi>
                  redirects: []
                )
                (command.Simple
                  blame_tok: <read>
                  more_env: []
                  words: [{<read>} {<_input>}]
                  redirects: []
                  do_fork: T
                )
                (command.Case
                  case_kw: <Id.KW_Case case>
                  to_match: (case_arg.Word w:{($ Id.VSub_DollarName _input)})
                  arms_start: <Id.KW_In in>
                  arms: [
                    (CaseArm
                      left: <Id.Lit_LBracket '['>
                      pattern: 
                        (pat.Words
                          words: [
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> 
                              <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ss> <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Ee> 
                              <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Yy> <Id.Lit_RBracket ']'>}
                          ]
                        )
                      middle: <Id.Right_CasePat _>
                      action: [
                        (command.ShAssignment
                          left: <Id.Lit_VarLike 'uidstart='>
                          pairs: [
                            (AssignPair
                              left: <Id.Lit_VarLike 'uidstart='>
                              lhs: (sh_lhs_expr.Name left:<Id.Lit_VarLike 'uidstart='> name:uidstart)
                              op: assign_op.Equal
                              rhs: 
                                {
                                  (CommandSub
                                    left_token: <Id.Left_Backtick '`'>
                                    child: 
                                      (command.Simple
                                        blame_tok: <get_nextuid>
                                        more_env: []
                                        words: [{<get_nextuid>} {($ Id.VSub_DollarName uidstart)}]
                                        redirects: []
                                        do_fork: T
                                      )
                                    right: <Id.Backtick_Right '`'>
                                  )
                                }
                            )
                          ]
                          redirects: []
                        )
                        (command.Simple
                          blame_tok: <input_interactive>
                          more_env: []
                          words: [{<input_interactive>}]
                          redirects: []
                          do_fork: T
                        )
                        (command.ControlFlow
                          keyword: <Id.ControlFlow_Continue continue>
                        )
                      ]
                      right: <Id.Op_DSemi _>
                    )
                    (CaseArm
                      left: <Id.Lit_LBracket '['>
                      pattern: 
                        (pat.Words
                          words: [
                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'> <Id.Lit_LBracket '['> <Oo> 
                              <Id.Lit_RBracket ']'>
                            }
                            {<Id.Lit_LBracket '['> <Nn> <Id.Lit_RBracket ']'>}
                          ]
                        )
                      middle: <Id.Right_CasePat _>
                      action: [
                        (command.Simple
                          blame_tok: <echo>
                          more_env: []
                          words: [{<echo>} {(DQ <'Goodbye!'>)}]
                          redirects: []
                          do_fork: T
                        )
                      ]
                      right: <Id.Op_DSemi _>
                    )
                    (CaseArm
                      left: <Id.Lit_Star '*'>
                      pattern: (pat.Words words:[{<Id.Lit_Star '*'>}])
                      middle: <Id.Right_CasePat _>
                      action: [(command.ControlFlow keyword:<Id.ControlFlow_Continue continue>)]
                      right: <Id.Op_DSemi _>
                    )
                  ]
                  arms_end: <Id.KW_Esac esac>
                  redirects: []
                )
                (command.ControlFlow keyword:<Id.ControlFlow_Break break>)
              ]
              right: <Id.KW_Done done>
            )
          redirects: []
        )
      ]
      fi_kw: <Id.KW_Fi fi>
      redirects: []
    )
  ]
)