<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_note_list(self, data=True, since=None, tags=[]):
 """ Method to get the note list The method can be passed optional arguments to limit the list to notes containing a certain tag, or only updated since a certain Simperium cursor. If omitted a list of all notes is returned. By default data objects are returned. If data is set to false only keys/ids and versions are returned. An empty data object is inserted for compatibility. Arguments: - tags=[] list of tags as string: return notes that have at least one of these tags - since=cursor Simperium cursor as string: return only changes since this cursor - data=True If false only return keys/ids and versions Returns: A tuple `(notes, status)` - notes (list):
 A list of note objects with all properties set except `content`. - status (int):
 0 on success and -1 otherwise """

        # initialize data
        status = 0
        ret = []
        response_notes = {}
        notes = { "index" : [] }

        # get the note index
        params = '/index?limit=%s' % (str(NOTE_FETCH_LENGTH))

        if since is not None:
            params += '&since=%s' % (since)
        # Fetching data is the default
        if data:
            params += '&data=true'

        # perform initial HTTP request
        request = Request(DATA_URL+params)
        request.add_header(self.header, self.get_token())
        try:
            response = urllib2.urlopen(request)
            response_notes = json.loads(response.read().decode('utf-8'))
            # re-write for v1 consistency
            note_objects = []
            for n in response_notes["index"]:
                # If data=False then can't do this bit... or not all of it, just have id and version. Add empty data object.
                if not data:
                    n['d'] = {}
                note_object = self.__add_simplenote_api_fields(n['d'], n['id'], n['v'])
                note_objects.append(note_object)
            notes["index"].extend(note_objects)
        except HTTPError as e:
            if e.code == 401:
                raise SimplenoteLoginFailed('Login to Simplenote API failed! Check Token.')
            else:
                return e, -1
        except IOError as e:
            return e, -1

        # get additional notes if bookmark was set in response
        while "mark" in response_notes:
            params += '&mark=%s' % response_notes["mark"]

            # perform the actual HTTP request
            request = Request(DATA_URL+params)
            request.add_header(self.header, self.get_token())
            try:
                response = urllib2.urlopen(request)
                response_notes = json.loads(response.read().decode('utf-8'))
                # re-write for v1 consistency
                note_objects = []
                for n in response_notes["index"]:
                    if not data:
                        n['d'] = {}
                    note_object = n['d']
                    note_object = self.__add_simplenote_api_fields(n['d'], n['id'], n['v'])
                    note_objects.append(note_object)
                notes["index"].extend(note_objects)
            except HTTPError as e:
                if e.code == 401:
                    raise SimplenoteLoginFailed('Login to Simplenote API failed! Check Token.')
                else:
                    return e, -1
            except IOError as e:
                return e, -1
        note_list = notes["index"]
        self.current = response_notes["current"]
        # Can only filter for tags at end, once all notes have been retrieved.
        if (len(tags) > 0):
            note_list = [n for n in note_list if (len(set(n["tags"]).intersection(tags)) > 0)]
        return note_list, status