<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 async def send_invoice(self, chat_id: base.Integer, title: base.String, description: base.String, payload: base.String, provider_token: base.String, start_parameter: base.String, currency: base.String, prices: typing.List[types.LabeledPrice], provider_data: typing.Union[typing.Dict, None] = None, photo_url: typing.Union[base.String, None] = None, photo_size: typing.Union[base.Integer, None] = None, photo_width: typing.Union[base.Integer, None] = None, photo_height: typing.Union[base.Integer, None] = None, need_name: typing.Union[base.Boolean, None] = None, need_phone_number: typing.Union[base.Boolean, None] = None, need_email: typing.Union[base.Boolean, None] = None, need_shipping_address: typing.Union[base.Boolean, None] = None, is_flexible: typing.Union[base.Boolean, None] = None, disable_notification: typing.Union[base.Boolean, None] = None, reply_to_message_id: typing.Union[base.Integer, None] = None, reply_markup: typing.Union[types.InlineKeyboardMarkup, None] = None) -> types.Message: """ Use this method to send invoices. Source: https://core.telegram.org/bots/api#sendinvoice :param chat_id: Unique identifier for the target private chat :type chat_id: :obj:`base.Integer` :param title: Product name, 1-32 characters :type title: :obj:`base.String` :param description: Product description, 1-255 characters :type description: :obj:`base.String` :param payload: Bot-defined invoice payload, 1-128 bytes This will not be displayed to the user, use for your internal processes. :type payload: :obj:`base.String` :param provider_token: Payments provider token, obtained via Botfather :type provider_token: :obj:`base.String` :param start_parameter: Unique deep-linking parameter that can be used to generate this invoice when used as a start parameter :type start_parameter: :obj:`base.String` :param currency: Three-letter ISO 4217 currency code, see more on currencies :type currency: :obj:`base.String` :param prices: Price breakdown, a list of components (e.g. product price, tax, discount, delivery cost, delivery tax, bonus, etc.) :type prices: :obj:`typing.List[types.LabeledPrice]` :param provider_data: JSON-encoded data about the invoice, which will be shared with the payment provider :type provider_data: :obj:`typing.Union[typing.Dict, None]` :param photo_url: URL of the product photo for the invoice :type photo_url: :obj:`typing.Union[base.String, None]` :param photo_size: Photo size :type photo_size: :obj:`typing.Union[base.Integer, None]` :param photo_width: Photo width :type photo_width: :obj:`typing.Union[base.Integer, None]` :param photo_height: Photo height :type photo_height: :obj:`typing.Union[base.Integer, None]` :param need_name: Pass True, if you require the user's full name to complete the order :type need_name: :obj:`typing.Union[base.Boolean, None]` :param need_phone_number: Pass True, if you require the user's phone number to complete the order :type need_phone_number: :obj:`typing.Union[base.Boolean, None]` :param need_email: Pass True, if you require the user's email to complete the order :type need_email: :obj:`typing.Union[base.Boolean, None]` :param need_shipping_address: Pass True, if you require the user's shipping address to complete the order :type need_shipping_address: :obj:`typing.Union[base.Boolean, None]` :param is_flexible: Pass True, if the final price depends on the shipping method :type is_flexible: :obj:`typing.Union[base.Boolean, None]` :param disable_notification: Sends the message silently. Users will receive a notification with no sound :type disable_notification: :obj:`typing.Union[base.Boolean, None]` :param reply_to_message_id: If the message is a reply, ID of the original message :type reply_to_message_id: :obj:`typing.Union[base.Integer, None]` :param reply_markup: A JSON-serialized object for an inline keyboard If empty, one 'Pay total price' button will be shown. If not empty, the first button must be a Pay button. :type reply_markup: :obj:`typing.Union[types.InlineKeyboardMarkup, None]` :return: On success, the sent Message is returned :rtype: :obj:`types.Message` """

        prices = prepare_arg([price.to_python() if hasattr(price, 'to_python') else price for price in prices])
        reply_markup = prepare_arg(reply_markup)
        payload_ = generate_payload(**locals())

        result = await self.request(api.Methods.SEND_INVOICE, payload_)
        return types.Message(**result)