# Path: zenpy/lib/exception.py
# class ZenpyException(Exception):
#     """
#     A ``ZenpyException`` is raised for internal errors.
#     """
# 
# Path: zenpy/lib/util.py
# def is_iterable_but_not_string(obj):
#     """
#     Determine whether or not obj is iterable but not a string (eg, a list, set, tuple etc).
#     """
#     return hasattr(obj, '__iter__') and not isinstance(
#         obj, str) and not isinstance(obj, bytes)
# 
# def to_unix_ts(start_time):
#     """Given a datetime object, returns its value as a unix timestamp"""
#     if isinstance(start_time, datetime):
#         if is_timezone_aware(start_time):
#             start_time = start_time.astimezone(pytz.utc)
#         else:
#             log.warning(
#                 "Non timezone-aware datetime object passed to IncrementalEndpoint. "
#                 "The Zendesk API expects UTC time, if this is not the case results will be incorrect!"
#             )
#         unix_time = calendar.timegm(start_time.timetuple())
#     else:
#         unix_time = start_time
# 
#     return int(unix_time)


import logging
from datetime import date
from datetime import datetime
from requests.utils import quote
from zenpy.lib.exception import ZenpyException
from zenpy.lib.util import is_iterable_but_not_string, to_unix_ts
    from urllib import urlencode
    from urlparse import urlunsplit, SplitResult
    from urllib.parse import urlencode
    from urllib.parse import urlunsplit, SplitResult
                elif value:
                    parameters[key] = value
            elif key in ('since_id', 'ticket_id',
                         'issue_id'):  # Jira integration
                parameters[key] = value

            # this is a bit of a hack
            elif key == 'role':
                if isinstance(value, basestring) or len(value) == 1:
                    parameters['role[]'] = value
                else:
                    parameters['role[]'] = value[0] + '&' + "&".join(
                        ('role[]={}'.format(role) for role in value[1:]))
            elif key.endswith('ids'):
                # if it looks like a type of unknown id, send it through as such
                parameters[key] = ",".join(map(str, value))

        if path == self.endpoint and not path.endswith('.json'):
            path += '.json'
        return Url(path=path, params=parameters)


class SecondaryEndpoint(BaseEndpoint):
    def __call__(self, id, **kwargs):
        return Url(self.endpoint % dict(id=id), params=kwargs)


class MultipleIDEndpoint(BaseEndpoint):
    def __call__(self, *args):
        if not args or len(args) < 2:

# Path: zenpy/lib/exception.py
# class ZenpyException(Exception):
#     """
#     A ``ZenpyException`` is raised for internal errors.
#     """
# 
# Path: zenpy/lib/util.py
# def is_iterable_but_not_string(obj):
#     """
#     Determine whether or not obj is iterable but not a string (eg, a list, set, tuple etc).
#     """
#     return hasattr(obj, '__iter__') and not isinstance(
#         obj, str) and not isinstance(obj, bytes)
# 
# def to_unix_ts(start_time):
#     """Given a datetime object, returns its value as a unix timestamp"""
#     if isinstance(start_time, datetime):
#         if is_timezone_aware(start_time):
#             start_time = start_time.astimezone(pytz.utc)
#         else:
#             log.warning(
#                 "Non timezone-aware datetime object passed to IncrementalEndpoint. "
#                 "The Zendesk API expects UTC time, if this is not the case results will be incorrect!"
#             )
#         unix_time = calendar.timegm(start_time.timetuple())
#     else:
#         unix_time = start_time
# 
#     return int(unix_time)


# Path: zenpy/lib/endpoint.py
import logging
from datetime import date
from datetime import datetime
from requests.utils import quote
from zenpy.lib.exception import ZenpyException
from zenpy.lib.util import is_iterable_but_not_string, to_unix_ts
    from urllib import urlencode
    from urlparse import urlunsplit, SplitResult
    from urllib.parse import urlencode
    from urllib.parse import urlunsplit, SplitResult

                elif value:
                    parameters[key] = value
            elif key in ('since_id', 'ticket_id',
                         'issue_id'):  # Jira integration
                parameters[key] = value

            # this is a bit of a hack
            elif key == 'role':
                if isinstance(value, basestring) or len(value) == 1:
                    parameters['role[]'] = value
                else:
                    parameters['role[]'] = value[0] + '&' + "&".join(
                        ('role[]={}'.format(role) for role in value[1:]))
            elif key.endswith('ids'):
                # if it looks like a type of unknown id, send it through as such
                parameters[key] = ",".join(map(str, value))

        if path == self.endpoint and not path.endswith('.json'):
            path += '.json'
        return Url(path=path, params=parameters)


class SecondaryEndpoint(BaseEndpoint):
    def __call__(self, id, **kwargs):
        return Url(self.endpoint % dict(id=id), params=kwargs)


class MultipleIDEndpoint(BaseEndpoint):
    def __call__(self, *args):
        if not args or len(args) < 2:

            raise ZenpyException(