(command.CommandList
  children: [
    (command.ShFunction
      name: check
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:credential_opts)
                  op: assign_op.Equal
                  rhs: (word.Empty)
                  spids: [20]
                )
              ]
            )
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:credential_cmd)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [23]
                )
              ]
            )
            (C {(shift)})
            (command.ForEach
              iter_name: arg
              iter_words: [{(DQ ($ Id.VSub_At '$@'))}]
              do_arg_iter: F
              body: 
                (command.DoGroup
                  children: [
                    (command.ShAssignment
                      pairs: [
                        (assign_pair
                          lhs: (sh_lhs_expr.Name name:credential_opts)
                          op: assign_op.Equal
                          rhs: 
                            {
                              (DQ ($ Id.VSub_DollarName '$credential_opts') 
                                (" -c credential.helper='") ($ Id.VSub_DollarName '$arg') ("'")
                              )
                            }
                          spids: [44]
                        )
                      ]
                    )
                  ]
                )
            )
            (command.AndOr
              ops: [Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp Id.Op_DAmp]
              children: [
                (command.Simple
                  words: [{(read_chunk)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:58)
                      fd: -1
                      arg_word: {(stdin)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(read_chunk)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:66)
                      fd: -1
                      arg_word: {(expect-stdout)}
                    )
                  ]
                )
                (command.Simple
                  words: [{(read_chunk)}]
                  redirects: [
                    (redir.Redir
                      op: (Token id:Id.Redir_Great val:'>' span_id:74)
                      fd: -1
                      arg_word: {(expect-stderr)}
                    )
                  ]
                )
                (command.If
                  arms: [
                    (if_arm
                      cond: [
                        (command.Sentence
                          child: 
                            (command.Pipeline
                              children: [
                                (C {(eval)} 
                                  {
                                    (DQ ('git ') ($ Id.VSub_DollarName '$credential_opts') 
                                      (' credential ') ($ Id.VSub_DollarName '$credential_cmd') (' <stdin >stdout 2>stderr')
                                    )
                                  }
                                )
                              ]
                              negated: T
                            )
                          terminator: (Token id:Id.Op_Semi val:';' span_id:93)
                        )
                      ]
                      action: [
                        (command.AndOr
                          ops: [Id.Op_DAmp Id.Op_DAmp]
                          children: [
                            (C {(echo)} 
                              {(DQ ('git credential failed with code ') ($ Id.VSub_QMark '$?'))}
                            )
                            (C {(cat)} {(stderr)})
                            (C {(false)})
                          ]
                        )
                      ]
                      spids: [80 95]
                    )
                  ]
                )
                (C {(test_cmp)} {(expect-stdout)} {(stdout)})
                (C {(test_cmp)} {(expect-stderr)} {(stderr)})
              ]
            )
          ]
        )
    )
    (command.ShFunction
      name: read_chunk
      body: 
        (command.BraceGroup
          children: [
            (command.WhileUntil
              keyword: (Token id:Id.KW_While val:while span_id:148)
              cond: [
                (command.Sentence
                  child: (C {(read)} {(line)})
                  terminator: (Token id:Id.Op_Semi val:';' span_id:153)
                )
              ]
              body: 
                (command.DoGroup
                  children: [
                    (command.Case
                      to_match: {(DQ ($ Id.VSub_DollarName '$line'))}
                      arms: [
                        (case_arm
                          pat_list: [{(--)}]
                          action: [
                            (command.ControlFlow
                              token: (Token id:Id.ControlFlow_Break val:break span_id:170)
                            )
                          ]
                          spids: [167 168 172 -1]
                        )
                        (case_arm
                          pat_list: [{(Id.Lit_Star '*')}]
                          action: [(C {(echo)} {(DQ ($ Id.VSub_DollarName '$line'))})]
                          spids: [175 176 184 -1]
                        )
                      ]
                    )
                  ]
                )
            )
          ]
        )
    )
    (command.ShFunction
      name: helper_test_clean
      body: 
        (command.BraceGroup
          children: [
            (C {(reject)} {($ Id.VSub_Number '$1')} {(https)} {(example.com)} {(store-user)})
            (C {(reject)} {($ Id.VSub_Number '$1')} {(https)} {(example.com)} {(user1)})
            (C {(reject)} {($ Id.VSub_Number '$1')} {(https)} {(example.com)} {(user2)})
            (C {(reject)} {($ Id.VSub_Number '$1')} {(http)} {(path.tld)} {(user)})
            (C {(reject)} {($ Id.VSub_Number '$1')} {(https)} {(timeout.tld)} {(user)})
          ]
        )
    )
    (command.ShFunction
      name: reject
      body: 
        (command.BraceGroup
          children: [
            (command.Pipeline
              children: [
                (command.Subshell
                  command_list: 
                    (command.CommandList
                      children: [
                        (C {(echo)} {(Id.Lit_VarLike 'protocol=') ($ Id.VSub_Number '$2')})
                        (C {(echo)} {(Id.Lit_VarLike 'host=') ($ Id.VSub_Number '$3')})
                        (C {(echo)} {(Id.Lit_VarLike 'username=') ($ Id.VSub_Number '$4')})
                      ]
                    )
                )
                (C {(git)} {(-c)} {(credential.helper) (Id.Lit_Equals '=') ($ Id.VSub_Number '$1')} 
                  {(credential)} {(reject)}
                )
              ]
              negated: F
            )
          ]
        )
    )
    (command.ShFunction
      name: helper_test
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:HELPER)
                  op: assign_op.Equal
                  rhs: {($ Id.VSub_Number '$1')}
                  spids: [334]
                )
              ]
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') has no existing data'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:348) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck fill $HELPER <<-\\EOF\n'
                    span_id: 349
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:350) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:351) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:352) 
                  (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:353) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:354) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tusername=askpass-username\n'
                    span_id: 355
                  ) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:356) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:357) (Token id:Id.Lit_Chars val:'\t\taskpass: Username for ' span_id:358)
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:360)) 
                (SQ (Token id:Id.Lit_Chars val:'https://example.com' span_id:362)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:364)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:366) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\taskpass: Password for '
                    span_id: 367
                  )
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:369)) 
                (SQ (Token id:Id.Lit_Chars val:'https://askpass-username@example.com' span_id:371)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:373)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:375) 
                  (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:376) (Token id:Id.Lit_Chars val:'\t' span_id:377)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') stores password'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:391) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck approve $HELPER <<-\\EOF\n'
                    span_id: 392
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:393) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:394) (Token id:Id.Lit_Chars val:'\t\tusername=store-user\n' span_id:395) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tpassword=store-pass\n'
                    span_id: 396
                  ) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:397) (Token id:Id.Lit_Chars val:'\t' span_id:398)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') can retrieve password'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:412) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck fill $HELPER <<-\\EOF\n'
                    span_id: 413
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:414) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:415) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:416) 
                  (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:417) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:418) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tusername=store-user\n'
                    span_id: 419
                  ) (Token id:Id.Lit_Chars val:'\t\tpassword=store-pass\n' span_id:420) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:421) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:422) (Token id:Id.Lit_Chars val:'\t' span_id:423)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') requires matching protocol'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:437) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck fill $HELPER <<-\\EOF\n'
                    span_id: 438
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=http\n' span_id:439) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:440) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:441) 
                  (Token id:Id.Lit_Chars val:'\t\tprotocol=http\n' span_id:442) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:443) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tusername=askpass-username\n'
                    span_id: 444
                  ) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:445) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:446) (Token id:Id.Lit_Chars val:'\t\taskpass: Username for ' span_id:447)
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:449)) 
                (SQ (Token id:Id.Lit_Chars val:'http://example.com' span_id:451)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:453)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:455) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\taskpass: Password for '
                    span_id: 456
                  )
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:458)) 
                (SQ (Token id:Id.Lit_Chars val:'http://askpass-username@example.com' span_id:460)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:462)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:464) 
                  (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:465) (Token id:Id.Lit_Chars val:'\t' span_id:466)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') requires matching host'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:480) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck fill $HELPER <<-\\EOF\n'
                    span_id: 481
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:482) 
                  (Token id:Id.Lit_Chars val:'\t\thost=other.tld\n' span_id:483) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:484) 
                  (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:485) (Token id:Id.Lit_Chars val:'\t\thost=other.tld\n' span_id:486) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tusername=askpass-username\n'
                    span_id: 487
                  ) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:488) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:489) (Token id:Id.Lit_Chars val:'\t\taskpass: Username for ' span_id:490)
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:492)) 
                (SQ (Token id:Id.Lit_Chars val:'https://other.tld' span_id:494)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:496)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:498) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\taskpass: Password for '
                    span_id: 499
                  )
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:501)) 
                (SQ (Token id:Id.Lit_Chars val:'https://askpass-username@other.tld' span_id:503)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:505)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:507) 
                  (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:508) (Token id:Id.Lit_Chars val:'\t' span_id:509)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') requires matching username'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:523) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck fill $HELPER <<-\\EOF\n'
                    span_id: 524
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:525) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:526) (Token id:Id.Lit_Chars val:'\t\tusername=other\n' span_id:527) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:528) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:529) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:530) (Token id:Id.Lit_Chars val:'\t\tusername=other\n' span_id:531) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tpassword=askpass-password\n'
                    span_id: 532
                  ) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:533) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\taskpass: Password for '
                    span_id: 534
                  )
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:536)) 
                (SQ (Token id:Id.Lit_Chars val:'https://other@example.com' span_id:538)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:540)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:542) 
                  (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:543) (Token id:Id.Lit_Chars val:'\t' span_id:544)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') requires matching path'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:558) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\ttest_config credential.usehttppath true &&\n'
                    span_id: 559
                  ) (Token id:Id.Lit_Chars val:'\t\tcheck approve $HELPER <<-\\EOF &&\n' span_id:560) 
                  (Token id:Id.Lit_Chars val:'\t\tprotocol=http\n' span_id:561) (Token id:Id.Lit_Chars val:'\t\thost=path.tld\n' span_id:562) 
                  (Token id:Id.Lit_Chars val:'\t\tpath=foo.git\n' span_id:563) (Token id:Id.Lit_Chars val:'\t\tusername=user\n' span_id:564) 
                  (Token id:Id.Lit_Chars val:'\t\tpassword=pass\n' span_id:565) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:566) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck fill $HELPER <<-\\EOF\n'
                    span_id: 567
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=http\n' span_id:568) 
                  (Token id:Id.Lit_Chars val:'\t\thost=path.tld\n' span_id:569) (Token id:Id.Lit_Chars val:'\t\tpath=bar.git\n' span_id:570) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:571) (Token id:Id.Lit_Chars val:'\t\tprotocol=http\n' span_id:572) 
                  (Token id:Id.Lit_Chars val:'\t\thost=path.tld\n' span_id:573) (Token id:Id.Lit_Chars val:'\t\tpath=bar.git\n' span_id:574) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tusername=askpass-username\n'
                    span_id: 575
                  ) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:576) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:577) (Token id:Id.Lit_Chars val:'\t\taskpass: Username for ' span_id:578)
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:580)) 
                (SQ (Token id:Id.Lit_Chars val:'http://path.tld/bar.git' span_id:582)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:584)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:586) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\taskpass: Password for '
                    span_id: 587
                  )
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:589)) 
                (SQ 
                  (Token
                    id: Id.Lit_Chars
                    val: 'http://askpass-username@path.tld/bar.git'
                    span_id: 591
                  )
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:593)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:595) 
                  (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:596) (Token id:Id.Lit_Chars val:'\t' span_id:597)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') can forget host'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:611) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck reject $HELPER <<-\\EOF &&\n'
                    span_id: 612
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:613) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:614) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:615) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck fill $HELPER <<-\\EOF\n'
                    span_id: 616
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:617) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:618) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:619) 
                  (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:620) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:621) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tusername=askpass-username\n'
                    span_id: 622
                  ) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:623) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:624) (Token id:Id.Lit_Chars val:'\t\taskpass: Username for ' span_id:625)
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:627)) 
                (SQ (Token id:Id.Lit_Chars val:'https://example.com' span_id:629)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:631)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:633) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\taskpass: Password for '
                    span_id: 634
                  )
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:636)) 
                (SQ (Token id:Id.Lit_Chars val:'https://askpass-username@example.com' span_id:638)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:640)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:642) 
                  (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:643) (Token id:Id.Lit_Chars val:'\t' span_id:644)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') can store multiple users'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:658) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck approve $HELPER <<-\\EOF &&\n'
                    span_id: 659
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:660) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:661) (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:662) 
                  (Token id:Id.Lit_Chars val:'\t\tpassword=pass1\n' span_id:663) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:664) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck approve $HELPER <<-\\EOF &&\n'
                    span_id: 665
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:666) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:667) (Token id:Id.Lit_Chars val:'\t\tusername=user2\n' span_id:668) 
                  (Token id:Id.Lit_Chars val:'\t\tpassword=pass2\n' span_id:669) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:670) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck fill $HELPER <<-\\EOF &&\n'
                    span_id: 671
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:672) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:673) (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:674) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:675) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:676) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:677) (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:678) 
                  (Token id:Id.Lit_Chars val:'\t\tpassword=pass1\n' span_id:679) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:680) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck fill $HELPER <<-\\EOF\n'
                    span_id: 681
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:682) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:683) (Token id:Id.Lit_Chars val:'\t\tusername=user2\n' span_id:684) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:685) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:686) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:687) (Token id:Id.Lit_Chars val:'\t\tusername=user2\n' span_id:688) 
                  (Token id:Id.Lit_Chars val:'\t\tpassword=pass2\n' span_id:689) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:690) (Token id:Id.Lit_Chars val:'\t' span_id:691)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') can forget user'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:705) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck reject $HELPER <<-\\EOF &&\n'
                    span_id: 706
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:707) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:708) (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:709) 
                  (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:710) (Token id:Id.Lit_Chars val:'\t\tcheck fill $HELPER <<-\\EOF\n' span_id:711) 
                  (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:712) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:713) 
                  (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:714) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:715) 
                  (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:716) (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:717) 
                  (Token id:Id.Lit_Chars val:'\t\tusername=user1\n' span_id:718) (Token id:Id.Lit_Chars val:'\t\tpassword=askpass-password\n' span_id:719) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:720) (Token id:Id.Lit_Chars val:'\t\taskpass: Password for ' span_id:721)
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:723)) 
                (SQ (Token id:Id.Lit_Chars val:'https://user1@example.com' span_id:725)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:727)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:729) 
                  (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:730) (Token id:Id.Lit_Chars val:'\t' span_id:731)
                )
              }
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') remembers other user'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:745) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck fill $HELPER <<-\\EOF\n'
                    span_id: 746
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:747) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:748) (Token id:Id.Lit_Chars val:'\t\tusername=user2\n' span_id:749) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:750) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:751) 
                  (Token id:Id.Lit_Chars val:'\t\thost=example.com\n' span_id:752) (Token id:Id.Lit_Chars val:'\t\tusername=user2\n' span_id:753) 
                  (Token id:Id.Lit_Chars val:'\t\tpassword=pass2\n' span_id:754) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:755) (Token id:Id.Lit_Chars val:'\t' span_id:756)
                )
              }
            )
          ]
        )
    )
    (command.ShFunction
      name: helper_test_timeout
      body: 
        (command.BraceGroup
          children: [
            (command.ShAssignment
              pairs: [
                (assign_pair
                  lhs: (sh_lhs_expr.Name name:HELPER)
                  op: assign_op.Equal
                  rhs: {(DQ ($ Id.VSub_Star '$*'))}
                  spids: [769]
                )
              ]
            )
            (C {(test_expect_success)} 
              {(DQ ('helper (') ($ Id.VSub_DollarName '$HELPER') (') times out'))} 
              {
                (SQ (Token id:Id.Lit_Chars val:'\n' span_id:785) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tcheck approve "$HELPER" <<-\\EOF &&\n'
                    span_id: 786
                  ) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:787) 
                  (Token id:Id.Lit_Chars val:'\t\thost=timeout.tld\n' span_id:788) (Token id:Id.Lit_Chars val:'\t\tusername=user\n' span_id:789) 
                  (Token id:Id.Lit_Chars val:'\t\tpassword=pass\n' span_id:790) (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:791) 
                  (Token id:Id.Lit_Chars val:'\t\tsleep 2 &&\n' span_id:792) (Token id:Id.Lit_Chars val:'\t\tcheck fill "$HELPER" <<-\\EOF\n' span_id:793) 
                  (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:794) (Token id:Id.Lit_Chars val:'\t\thost=timeout.tld\n' span_id:795) 
                  (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:796) (Token id:Id.Lit_Chars val:'\t\tprotocol=https\n' span_id:797) 
                  (Token id:Id.Lit_Chars val:'\t\thost=timeout.tld\n' span_id:798) (Token id:Id.Lit_Chars val:'\t\tusername=askpass-username\n' span_id:799) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\tpassword=askpass-password\n'
                    span_id: 800
                  ) (Token id:Id.Lit_Chars val:'\t\t--\n' span_id:801) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\taskpass: Username for '
                    span_id: 802
                  )
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:804)) 
                (SQ (Token id:Id.Lit_Chars val:'https://timeout.tld' span_id:806)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:808)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:810) 
                  (Token
                    id: Id.Lit_Chars
                    val: '\t\taskpass: Password for '
                    span_id: 811
                  )
                ) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:813)) 
                (SQ (Token id:Id.Lit_Chars val:'https://askpass-username@timeout.tld' span_id:815)) (word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:"\\'" span_id:817)) 
                (SQ (Token id:Id.Lit_Chars val:':\n' span_id:819) 
                  (Token id:Id.Lit_Chars val:'\t\tEOF\n' span_id:820) (Token id:Id.Lit_Chars val:'\t' span_id:821)
                )
              }
            )
          ]
        )
    )
    (command.Simple
      words: [{(write_script)} {(askpass)}]
      redirects: [
        (redir.HereDoc
          op: (Token id:Id.Redir_DLess val:'<<' span_id:831)
          fd: -1
          here_begin: 
            {(word_part.EscapedLiteral token:(Token id:Id.Lit_EscapedChar val:'\\E' span_id:832)) 
              (OF)
            }
          here_end_span_id: 838
          stdin_parts: [
            ('echo >&2 askpass: $*\n')
            ('what=$(echo $1 | cut -d" " -f1 | tr A-Z a-z | tr -cd a-z)\n')
            ('echo "askpass-$what"\n')
          ]
        )
      ]
    )
    (command.ShAssignment
      pairs: [
        (assign_pair
          lhs: (sh_lhs_expr.Name name:GIT_ASKPASS)
          op: assign_op.Equal
          rhs: {(DQ ($ Id.VSub_DollarName '$PWD') (/askpass))}
          spids: [839]
        )
      ]
    )
    (C {(export)} {(GIT_ASKPASS)})
  ]
)