     function _isContained(bytes32 _hash, bytes _proof, bytes32 _root) internal pure returns (bool) {
         bytes32 cursor = _hash;
         bytes32 proofElem;
         for (uint256 i = 64; i <= _proof.length; i += 32) {
             assembly { proofElem := mload(add(_proof, i)) }
             if (cursor < proofElem) {
                 cursor = keccak256(abi.encodePacked(cursor, proofElem));
             } else {
                 cursor = keccak256(abi.encodePacked(proofElem, cursor));
             }
         }
         return cursor == _root;
     }