def parse_csa2
      s0 = @current_pos
      if parse_version22 != :failed
        s1 = parse_information
        s1 = nil if s1 == :failed
        s2 = parse_initial_board
        if s2 != :failed
          s3 = parse_moves
          s3 = nil if s3 == :failed
          @reported_pos = s0
          s0 = -> (info, ini, ms) do
            ret = { "header" => info["header"], "initial" => ini, "moves" => ms }
            if info && info["players"]
              ret["header"]["先手"] = info["players"][0] if info["players"][0]
              ret["header"]["後手"] = info["players"][1] if info["players"][1]
            end
            ret
          end.call(s1, s2, s3)
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
def parse_csa2
      s0 = @current_pos
      if parse_version22 != :failed
        s1 = parse_information
        s1 = nil if s1 == :failed
        s2 = parse_initial_board
        if s2 != :failed
          s3 = parse_moves
          s3 = nil if s3 == :failed
          @reported_pos = s0
          s0 = -> (info, ini, ms) do
            ret = { "header" => info["header"], "initial" => ini, "moves" => ms }
            if info && info["players"]
              ret["header"]["先手"] = info["players"][0] if info["players"][0]
              ret["header"]["後手"] = info["players"][1] if info["players"][1]
            end
            ret
          end.call(s1, s2, s3)
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
csa2 : version22 information? initialboard moves?