def _main(self, client, copy_source, bucket, key, upload_id, part_number,<EOL>extra_args, callbacks, size):
response = client.upload_part_copy(<EOL>CopySource=copy_source, Bucket=bucket, Key=key,<EOL>UploadId=upload_id, PartNumber=part_number, **extra_args)<EOL>for callback in callbacks:<EOL><INDENT>callback(bytes_transferred=size)<EOL><DEDENT>etag = response['<STR_LIT>']['<STR_LIT>']<EOL>return {'<STR_LIT>': etag, '<STR_LIT>': part_number}<EOL>
:param client: The client to use when calling PutObject
:param copy_source: The CopySource parameter to use
:param bucket: The name of the bucket to upload to
:param key: The name of the key to upload to
:param upload_id: The id of the upload
:param part_number: The number representing the part of the multipart
    upload
:param extra_args: A dictionary of any extra arguments that may be
    used in the upload.
:param callbacks: List of callbacks to call after copy part
:param size: The size of the transfer. This value is passed into
    the callbacks

:rtype: dict
:returns: A dictionary representing a part::

    {'Etag': etag_value, 'PartNumber': part_number}

    This value can be appended to a list to be used to complete
    the multipart upload.