<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def fill_empty(self, fixed_values, input):
 """Fill in random values for all empty-valued ItemData elements in an ODM document"""

        odm_elements = etree.fromstring(input)

        for v in odm_elements.iter(E_ODM.ITEM_DATA.value):
            if v.get(A_ODM.VALUE.value) == "":
                oid = v.get(A_ODM.ITEM_OID.value)

                if fixed_values is not None and oid in fixed_values:
                    d = fixed_values[oid]
                else:
                    d = self.scramble_itemdata(v.get(A_ODM.ITEM_OID.value), v.get(A_ODM.VALUE.value))

                v.set(A_ODM.VALUE.value, d)
            else:
                # Remove ItemData if it already has a value
                v.getparent().remove(v)

        # Remove empty ItemGroupData elements
        for v in odm_elements.iter(E_ODM.ITEM_GROUP_DATA.value):
            if len(v) == 0:
                v.getparent().remove(v)

        # Remove empty FormData elements
        for v in odm_elements.iter(E_ODM.FORM_DATA.value):
            if len(v) == 0:
                v.getparent().remove(v)

        # Remove empty StudyEventData elements
        for v in odm_elements.iter(E_ODM.STUDY_EVENT_DATA.value):
            if len(v) == 0:
                v.getparent().remove(v)

        return etree.tostring(odm_elements)