<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def map_sites(self, stmts):
 """Check a set of statements for invalid modification sites. Statements are checked against Uniprot reference sequences to determine if residues referred to by post-translational modifications exist at the given positions. If there is nothing amiss with a statement (modifications on any of the agents, modifications made in the statement, etc.), then the statement goes into the list of valid statements. If there is a problem with the statement, the offending modifications are looked up in the site map (:py:attr:`site_map`), and an instance of :py:class:`MappedStatement` is added to the list of mapped statements. Parameters stmts : list of :py:class:`indra.statement.Statement` The statements to check for site errors. Returns ------- tuple 2-tuple containing (valid_statements, mapped_statements). The first element of the tuple is a list of valid statements (:py:class:`indra.statement.Statement`) that were not found to contain any site errors. The second element of the tuple is a list of mapped statements (:py:class:`MappedStatement`) with information on the incorrect sites and corresponding statements with correctly mapped sites. """

        valid_statements = []
        mapped_statements = []

        for stmt in stmts:
            mapped_stmt = self.map_stmt_sites(stmt)
            # If we got a MappedStatement as a return value, we add that to the
            # list of mapped statements, otherwise, the original Statement is
            # not invalid so we add it to the other list directly.
            if mapped_stmt is not None:
                mapped_statements.append(mapped_stmt)
            else:
                valid_statements.append(stmt)

        return valid_statements, mapped_statements