�
��gk� � � � d dl mZ d dlmZmZmZmZmZ d dlm Z m
Z
d dlmZ d dl
mZmZ d dlmZmZmZ d dlmZmZmZ d dlmZmZmZ d d lmZ d d
lmZm Z d dl!m"Z"m#Z#m$Z$ d dl%m&Z&m'Z'm(Z( d d
l)m*Z* d dl+m,Z, d dl-m.Z. d dl/m0Z0m1Z1 d%d�Z2d� Z3d&d�Z4d� Z5dd�d�Z6d'd�Z7d� Z8d(d�Z9d(d�Z:d(d�Z;d � Z<d!� Z=d"� Z>e=Z?e>Z@e<ZAd#� ZBd$� ZCdS ))� )�defaultdict)�sympify�S�Mul�
Derivative�Pow)�_unevaluated_Add�Add)�assumptions)�Factors� gcd_terms)�_mexpand�
expand_mul�expand_power_base)�_keep_coeff�_unevaluated_Mul�_mulsort)�Rational�zoo�nan)�global_parameters)�ordered�default_sort_key)�Dummy�Wild�symbols)�exp�sqrt�log)�Abs)�gcd)�
sqrtdenest)�iterable�siftNFTc �
�����&�'�(�)�*� t | � � } d� t �� � r�n�gD � � �d� }t �|d�� � \ }}|r�t t |d� |D � � � � � � �)�)fd��D � � �t | � �)� � ��|���� � } d� �)� � � D � � �*t | t � � s| � �*� � S �*fd �| � � � D � � S ���t � � }
t j | � � D ]c} |j
�� r|�v r�|j s|�vr|
� |� � �2 |j |j �� d � }|�vr|
� |� � �dt% �fd�|
D � � � � }
�t'