/* Generated by Cython 0.21.1 */

#define PY_SSIZE_T_CLEAN
#ifndef CYTHON_USE_PYLONG_INTERNALS
#ifdef PYLONG_BITS_IN_DIGIT
#define CYTHON_USE_PYLONG_INTERNALS 0
#else
#include "pyconfig.h"
#ifdef PYLONG_BITS_IN_DIGIT
#define CYTHON_USE_PYLONG_INTERNALS 1
#else
#define CYTHON_USE_PYLONG_INTERNALS 0
#endif
#endif
#endif
#include "Python.h"
#ifndef Py_PYTHON_H
    #error Python headers needed to compile C extensions, please install development version of Python.
#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03020000)
    #error Cython requires Python 2.6+ or Python 3.2+.
#else
#define CYTHON_ABI "0_21_1"
#include <stddef.h>
#ifndef offsetof
#define offsetof(type, member) ( (size_t) & ((type*)0) -> member )
#endif
#if !defined(WIN32) && !defined(MS_WINDOWS)
  #ifndef __stdcall
    #define __stdcall
  #endif
  #ifndef __cdecl
    #define __cdecl
  #endif
  #ifndef __fastcall
    #define __fastcall
  #endif
#endif
#ifndef DL_IMPORT
  #define DL_IMPORT(t) t
#endif
#ifndef DL_EXPORT
  #define DL_EXPORT(t) t
#endif
#ifndef PY_LONG_LONG
  #define PY_LONG_LONG LONG_LONG
#endif
#ifndef Py_HUGE_VAL
  #define Py_HUGE_VAL HUGE_VAL
#endif
#ifdef PYPY_VERSION
#define CYTHON_COMPILING_IN_PYPY 1
#define CYTHON_COMPILING_IN_CPYTHON 0
#else
#define CYTHON_COMPILING_IN_PYPY 0
#define CYTHON_COMPILING_IN_CPYTHON 1
#endif
#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600
#define Py_OptimizeFlag 0
#endif
#define __PYX_BUILD_PY_SSIZE_T "n"
#define CYTHON_FORMAT_SSIZE_T "z"
#if PY_MAJOR_VERSION < 3
  #define __Pyx_BUILTIN_MODULE_NAME "__builtin__"
  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
          PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
  #define __Pyx_DefaultClassType PyClass_Type
#else
  #define __Pyx_BUILTIN_MODULE_NAME "builtins"
  #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \
          PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)
  #define __Pyx_DefaultClassType PyType_Type
#endif
#if PY_MAJOR_VERSION >= 3
  #define Py_TPFLAGS_CHECKTYPES 0
  #define Py_TPFLAGS_HAVE_INDEX 0
  #define Py_TPFLAGS_HAVE_NEWBUFFER 0
#endif
#if PY_VERSION_HEX < 0x030400a1 && !defined(Py_TPFLAGS_HAVE_FINALIZE)
  #define Py_TPFLAGS_HAVE_FINALIZE 0
#endif
#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND)
  #define CYTHON_PEP393_ENABLED 1
  #define __Pyx_PyUnicode_READY(op)       (likely(PyUnicode_IS_READY(op)) ? \
                                              0 : _PyUnicode_Ready((PyObject *)(op)))
  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_LENGTH(u)
  #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i)
  #define __Pyx_PyUnicode_KIND(u)         PyUnicode_KIND(u)
  #define __Pyx_PyUnicode_DATA(u)         PyUnicode_DATA(u)
  #define __Pyx_PyUnicode_READ(k, d, i)   PyUnicode_READ(k, d, i)
#else
  #define CYTHON_PEP393_ENABLED 0
  #define __Pyx_PyUnicode_READY(op)       (0)
  #define __Pyx_PyUnicode_GET_LENGTH(u)   PyUnicode_GET_SIZE(u)
  #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i]))
  #define __Pyx_PyUnicode_KIND(u)         (sizeof(Py_UNICODE))
  #define __Pyx_PyUnicode_DATA(u)         ((void*)PyUnicode_AS_UNICODE(u))
  #define __Pyx_PyUnicode_READ(k, d, i)   ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i]))
#endif
#if CYTHON_COMPILING_IN_PYPY
  #define __Pyx_PyUnicode_Concat(a, b)      PyNumber_Add(a, b)
  #define __Pyx_PyUnicode_ConcatSafe(a, b)  PyNumber_Add(a, b)
  #define __Pyx_PyFrozenSet_Size(s)         PyObject_Size(s)
#else
  #define __Pyx_PyUnicode_Concat(a, b)      PyUnicode_Concat(a, b)
  #define __Pyx_PyUnicode_ConcatSafe(a, b)  ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ? \
      PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b))
  #define __Pyx_PyFrozenSet_Size(s)         PySet_Size(s)
#endif
#define __Pyx_PyString_FormatSafe(a, b)   ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b))
#define __Pyx_PyUnicode_FormatSafe(a, b)  ((unlikely((a) == Py_None)) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b))
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyString_Format(a, b)  PyUnicode_Format(a, b)
#else
  #define __Pyx_PyString_Format(a, b)  PyString_Format(a, b)
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyBaseString_Type            PyUnicode_Type
  #define PyStringObject               PyUnicodeObject
  #define PyString_Type                PyUnicode_Type
  #define PyString_Check               PyUnicode_Check
  #define PyString_CheckExact          PyUnicode_CheckExact
#endif
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj)
  #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj)
#else
  #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj))
  #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj))
#endif
#ifndef PySet_CheckExact
  #define PySet_CheckExact(obj)        (Py_TYPE(obj) == &PySet_Type)
#endif
#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type)
#if PY_MAJOR_VERSION >= 3
  #define PyIntObject                  PyLongObject
  #define PyInt_Type                   PyLong_Type
  #define PyInt_Check(op)              PyLong_Check(op)
  #define PyInt_CheckExact(op)         PyLong_CheckExact(op)
  #define PyInt_FromString             PyLong_FromString
  #define PyInt_FromUnicode            PyLong_FromUnicode
  #define PyInt_FromLong               PyLong_FromLong
  #define PyInt_FromSize_t             PyLong_FromSize_t
  #define PyInt_FromSsize_t            PyLong_FromSsize_t
  #define PyInt_AsLong                 PyLong_AsLong
  #define PyInt_AS_LONG                PyLong_AS_LONG
  #define PyInt_AsSsize_t              PyLong_AsSsize_t
  #define PyInt_AsUnsignedLongMask     PyLong_AsUnsignedLongMask
  #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask
  #define PyNumber_Int                 PyNumber_Long
#endif
#if PY_MAJOR_VERSION >= 3
  #define PyBoolObject                 PyLongObject
#endif
#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY
  #ifndef PyUnicode_InternFromString
    #define PyUnicode_InternFromString(s) PyUnicode_FromString(s)
  #endif
#endif
#if PY_VERSION_HEX < 0x030200A4
  typedef long Py_hash_t;
  #define __Pyx_PyInt_FromHash_t PyInt_FromLong
  #define __Pyx_PyInt_AsHash_t   PyInt_AsLong
#else
  #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t
  #define __Pyx_PyInt_AsHash_t   PyInt_AsSsize_t
#endif
#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func))
#else
  #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass)
#endif
#ifndef CYTHON_INLINE
  #if defined(__GNUC__)
    #define CYTHON_INLINE __inline__
  #elif defined(_MSC_VER)
    #define CYTHON_INLINE __inline
  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define CYTHON_INLINE inline
  #else
    #define CYTHON_INLINE
  #endif
#endif
#ifndef CYTHON_RESTRICT
  #if defined(__GNUC__)
    #define CYTHON_RESTRICT __restrict__
  #elif defined(_MSC_VER) && _MSC_VER >= 1400
    #define CYTHON_RESTRICT __restrict
  #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L
    #define CYTHON_RESTRICT restrict
  #else
    #define CYTHON_RESTRICT
  #endif
#endif
#ifdef NAN
#define __PYX_NAN() ((float) NAN)
#else
static CYTHON_INLINE float __PYX_NAN() {
  /* Initialize NaN. The sign is irrelevant, an exponent with all bits 1 and
   a nonzero mantissa means NaN. If the first bit in the mantissa is 1, it is
   a quiet NaN. */
  float value;
  memset(&value, 0xFF, sizeof(value));
  return value;
}
#endif
#ifdef __cplusplus
template<typename T>
void __Pyx_call_destructor(T* x) {
    x->~T();
}
#endif


#if PY_MAJOR_VERSION >= 3
  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
#else
  #define __Pyx_PyNumber_Divide(x,y)         PyNumber_TrueDivide(x,y)
  #define __Pyx_PyNumber_InPlaceDivide(x,y)  PyNumber_InPlaceTrueDivide(x,y)
#endif

#ifndef __PYX_EXTERN_C
  #ifdef __cplusplus
    #define __PYX_EXTERN_C extern "C"
  #else
    #define __PYX_EXTERN_C extern
  #endif
#endif

#if defined(WIN32) || defined(MS_WINDOWS)
#define _USE_MATH_DEFINES
#endif
#include <math.h>
#define __PYX_HAVE___cdecimalfp
#define __PYX_HAVE_API___cdecimalfp
#include "limits.h"
#include "string.h"
#include "stdlib.h"
#include "stdio.h"
#ifdef _OPENMP
#include <omp.h>
#endif /* _OPENMP */

#ifdef PYREX_WITHOUT_ASSERTIONS
#define CYTHON_WITHOUT_ASSERTIONS
#endif

#ifndef CYTHON_UNUSED
# if defined(__GNUC__)
#   if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4))
#     define CYTHON_UNUSED __attribute__ ((__unused__))
#   else
#     define CYTHON_UNUSED
#   endif
# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER))
#   define CYTHON_UNUSED __attribute__ ((__unused__))
# else
#   define CYTHON_UNUSED
# endif
#endif
typedef struct {PyObject **p; char *s; const Py_ssize_t n; const char* encoding;
                const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry;

#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0
#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT 0
#define __PYX_DEFAULT_STRING_ENCODING ""
#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString
#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
#define __Pyx_fits_Py_ssize_t(v, type, is_signed)  (    \
    (sizeof(type) < sizeof(Py_ssize_t))  ||             \
    (sizeof(type) > sizeof(Py_ssize_t) &&               \
          likely(v < (type)PY_SSIZE_T_MAX ||            \
                 v == (type)PY_SSIZE_T_MAX)  &&         \
          (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||       \
                                v == (type)PY_SSIZE_T_MIN)))  ||  \
    (sizeof(type) == sizeof(Py_ssize_t) &&              \
          (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||        \
                               v == (type)PY_SSIZE_T_MAX)))  )
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject*);
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length);
#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s))
#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l)
#define __Pyx_PyBytes_FromString        PyBytes_FromString
#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize
static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*);
#if PY_MAJOR_VERSION < 3
    #define __Pyx_PyStr_FromString        __Pyx_PyBytes_FromString
    #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize
#else
    #define __Pyx_PyStr_FromString        __Pyx_PyUnicode_FromString
    #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize
#endif
#define __Pyx_PyObject_AsSString(s)    ((signed char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_AsUString(s)    ((unsigned char*) __Pyx_PyObject_AsString(s))
#define __Pyx_PyObject_FromUString(s)  __Pyx_PyObject_FromString((const char*)s)
#define __Pyx_PyBytes_FromUString(s)   __Pyx_PyBytes_FromString((const char*)s)
#define __Pyx_PyByteArray_FromUString(s)   __Pyx_PyByteArray_FromString((const char*)s)
#define __Pyx_PyStr_FromUString(s)     __Pyx_PyStr_FromString((const char*)s)
#define __Pyx_PyUnicode_FromUString(s) __Pyx_PyUnicode_FromString((const char*)s)
#if PY_MAJOR_VERSION < 3
static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u)
{
    const Py_UNICODE *u_end = u;
    while (*u_end++) ;
    return (size_t)(u_end - u - 1);
}
#else
#define __Pyx_Py_UNICODE_strlen Py_UNICODE_strlen
#endif
#define __Pyx_PyUnicode_FromUnicode(u)       PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u))
#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode
#define __Pyx_PyUnicode_AsUnicode            PyUnicode_AsUnicode
#define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None)
#define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False))
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*);
static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x);
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*);
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t);
#if CYTHON_COMPILING_IN_CPYTHON
#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x))
#else
#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x)
#endif
#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x))
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
static int __Pyx_sys_getdefaultencoding_not_ascii;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
    PyObject* sys;
    PyObject* default_encoding = NULL;
    PyObject* ascii_chars_u = NULL;
    PyObject* ascii_chars_b = NULL;
    const char* default_encoding_c;
    sys = PyImport_ImportModule("sys");
    if (!sys) goto bad;
    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
    Py_DECREF(sys);
    if (!default_encoding) goto bad;
    default_encoding_c = PyBytes_AsString(default_encoding);
    if (!default_encoding_c) goto bad;
    if (strcmp(default_encoding_c, "ascii") == 0) {
        __Pyx_sys_getdefaultencoding_not_ascii = 0;
    } else {
        char ascii_chars[128];
        int c;
        for (c = 0; c < 128; c++) {
            ascii_chars[c] = c;
        }
        __Pyx_sys_getdefaultencoding_not_ascii = 1;
        ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL);
        if (!ascii_chars_u) goto bad;
        ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL);
        if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) {
            PyErr_Format(
                PyExc_ValueError,
                "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.",
                default_encoding_c);
            goto bad;
        }
        Py_DECREF(ascii_chars_u);
        Py_DECREF(ascii_chars_b);
    }
    Py_DECREF(default_encoding);
    return 0;
bad:
    Py_XDECREF(default_encoding);
    Py_XDECREF(ascii_chars_u);
    Py_XDECREF(ascii_chars_b);
    return -1;
}
#endif
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL)
#else
#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL)
#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
static char* __PYX_DEFAULT_STRING_ENCODING;
static int __Pyx_init_sys_getdefaultencoding_params(void) {
    PyObject* sys;
    PyObject* default_encoding = NULL;
    char* default_encoding_c;
    sys = PyImport_ImportModule("sys");
    if (!sys) goto bad;
    default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL);
    Py_DECREF(sys);
    if (!default_encoding) goto bad;
    default_encoding_c = PyBytes_AsString(default_encoding);
    if (!default_encoding_c) goto bad;
    __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c));
    if (!__PYX_DEFAULT_STRING_ENCODING) goto bad;
    strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c);
    Py_DECREF(default_encoding);
    return 0;
bad:
    Py_XDECREF(default_encoding);
    return -1;
}
#endif
#endif


/* Test for GCC > 2.95 */
#if defined(__GNUC__)     && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)))
  #define likely(x)   __builtin_expect(!!(x), 1)
  #define unlikely(x) __builtin_expect(!!(x), 0)
#else /* !__GNUC__ or GCC < 2.95 */
  #define likely(x)   (x)
  #define unlikely(x) (x)
#endif /* __GNUC__ */

static PyObject *__pyx_m;
static PyObject *__pyx_d;
static PyObject *__pyx_b;
static PyObject *__pyx_empty_tuple;
static PyObject *__pyx_empty_bytes;
static int __pyx_lineno;
static int __pyx_clineno = 0;
static const char * __pyx_cfilenm= __FILE__;
static const char *__pyx_filename;


static const char *__pyx_f[] = {
  "_cdecimalfp.pyx",
};

/*--- Type declarations ---*/
struct __pyx_obj_11_cdecimalfp_Decimal;
struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping;
struct __pyx_opt_args_11_cdecimalfp__approx_rational;
struct __pyx_opt_args_11_cdecimalfp__adjust;
struct __pyx_opt_args_11_cdecimalfp__get_adjusted_value;
struct __pyx_opt_args_11_cdecimalfp__div_rounded;
struct __pyx_opt_args_11_cdecimalfp__round;

/* "_cdecimalfp.pyx":770
 * 
 * 
 * cdef bint _approx_rational(Decimal dec, object num, object den,             # <<<<<<<<<<<<<<
 *                            int minPrec=0) except *:
 *     """Approximate num / den as Decimal.
 */
struct __pyx_opt_args_11_cdecimalfp__approx_rational {
  int __pyx_n;
  int minPrec;
};

/* "_cdecimalfp.pyx":909
 * 
 * 
 * cdef void _adjust(Decimal dec, int prec, object rounding=None) except *:             # <<<<<<<<<<<<<<
 *     """Adjust Decimal `dec` to precision `prec` using given rounding mode
 *     (or default mode if none is given)."""
 */
struct __pyx_opt_args_11_cdecimalfp__adjust {
  int __pyx_n;
  PyObject *rounding;
};

/* "_cdecimalfp.pyx":926
 * 
 * 
 * cdef object _get_adjusted_value(Decimal dec, int prec, object rounding=None):             # <<<<<<<<<<<<<<
 *     """Return rv so that rv // 10 ** rp = v // 10 ** p,
 *     rounded to precision rp using given rounding mode (or default mode if none
 */
struct __pyx_opt_args_11_cdecimalfp__get_adjusted_value {
  int __pyx_n;
  PyObject *rounding;
};

/* "_cdecimalfp.pyx":956
 * 
 * # divide x by y, return rounded result
 * cdef object _div_rounded(object x, object y, object rounding=None):             # <<<<<<<<<<<<<<
 *     """Return x // y, rounded using given rounding mode (or default mode
 *     if none is given)."""
 */
struct __pyx_opt_args_11_cdecimalfp__div_rounded {
  int __pyx_n;
  PyObject *rounding;
};

/* "_cdecimalfp.pyx":1349
 * 
 * 
 * cdef int _round(q, r, y, rounding=None):             # <<<<<<<<<<<<<<
 *     if rounding is None:
 *         rounding = get_rounding()
 */
struct __pyx_opt_args_11_cdecimalfp__round {
  int __pyx_n;
  PyObject *rounding;
};

/* "_cdecimalfp.pyx":62
 * # Extension type Decimal
 * 
 * cdef class Decimal:             # <<<<<<<<<<<<<<
 * 
 *     """Decimal number with a given number of fractional digits.
 */
struct __pyx_obj_11_cdecimalfp_Decimal {
  PyObject_HEAD
  PyObject *_value;
  int _precision;
};


/* "_cdecimalfp.pyx":893
 * 
 * 
 * def _iterGrouping(grouping):             # <<<<<<<<<<<<<<
 *     l = None
 *     for i in grouping[:-1]:
 */
struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping {
  PyObject_HEAD
  PyObject *__pyx_v_grouping;
  PyObject *__pyx_v_i;
  PyObject *__pyx_v_l;
  PyObject *__pyx_t_0;
  Py_ssize_t __pyx_t_1;
  PyObject *(*__pyx_t_2)(PyObject *);
};

#ifndef CYTHON_REFNANNY
  #define CYTHON_REFNANNY 0
#endif
#if CYTHON_REFNANNY
  typedef struct {
    void (*INCREF)(void*, PyObject*, int);
    void (*DECREF)(void*, PyObject*, int);
    void (*GOTREF)(void*, PyObject*, int);
    void (*GIVEREF)(void*, PyObject*, int);
    void* (*SetupContext)(const char*, int, const char*);
    void (*FinishContext)(void**);
  } __Pyx_RefNannyAPIStruct;
  static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL;
  static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname);
  #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL;
#ifdef WITH_THREAD
  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
          if (acquire_gil) { \
              PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \
              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
              PyGILState_Release(__pyx_gilstate_save); \
          } else { \
              __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \
          }
#else
  #define __Pyx_RefNannySetupContext(name, acquire_gil) \
          __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__)
#endif
  #define __Pyx_RefNannyFinishContext() \
          __Pyx_RefNanny->FinishContext(&__pyx_refnanny)
  #define __Pyx_INCREF(r)  __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_DECREF(r)  __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_GOTREF(r)  __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__)
  #define __Pyx_XINCREF(r)  do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0)
  #define __Pyx_XDECREF(r)  do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0)
  #define __Pyx_XGOTREF(r)  do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0)
  #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0)
#else
  #define __Pyx_RefNannyDeclarations
  #define __Pyx_RefNannySetupContext(name, acquire_gil)
  #define __Pyx_RefNannyFinishContext()
  #define __Pyx_INCREF(r) Py_INCREF(r)
  #define __Pyx_DECREF(r) Py_DECREF(r)
  #define __Pyx_GOTREF(r)
  #define __Pyx_GIVEREF(r)
  #define __Pyx_XINCREF(r) Py_XINCREF(r)
  #define __Pyx_XDECREF(r) Py_XDECREF(r)
  #define __Pyx_XGOTREF(r)
  #define __Pyx_XGIVEREF(r)
#endif
#define __Pyx_XDECREF_SET(r, v) do {                            \
        PyObject *tmp = (PyObject *) r;                         \
        r = v; __Pyx_XDECREF(tmp);                              \
    } while (0)
#define __Pyx_DECREF_SET(r, v) do {                             \
        PyObject *tmp = (PyObject *) r;                         \
        r = v; __Pyx_DECREF(tmp);                               \
    } while (0)
#define __Pyx_CLEAR(r)    do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0)
#define __Pyx_XCLEAR(r)   do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0)

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) {
    PyTypeObject* tp = Py_TYPE(obj);
    if (likely(tp->tp_getattro))
        return tp->tp_getattro(obj, attr_name);
#if PY_MAJOR_VERSION < 3
    if (likely(tp->tp_getattr))
        return tp->tp_getattr(obj, PyString_AS_STRING(attr_name));
#endif
    return PyObject_GetAttr(obj, attr_name);
}
#else
#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n)
#endif

static PyObject *__Pyx_GetBuiltinName(PyObject *name);

static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name);

static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \
    PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \
    const char* function_name);

static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact,
    Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found);

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw);
#else
#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw)
#endif

static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb);
static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb);

static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause);

static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name);

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg);
#endif

static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg);

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func);
#else
#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL)
#endif

static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb);
static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb);

static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb);

static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected);

static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index);

static CYTHON_INLINE int __Pyx_IterFinish(void);

static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected);

static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type);

#define __Pyx_CyFunction_USED 1
#include <structmember.h>
#define __Pyx_CYFUNCTION_STATICMETHOD  0x01
#define __Pyx_CYFUNCTION_CLASSMETHOD   0x02
#define __Pyx_CYFUNCTION_CCLASS        0x04
#define __Pyx_CyFunction_GetClosure(f) \
    (((__pyx_CyFunctionObject *) (f))->func_closure)
#define __Pyx_CyFunction_GetClassObj(f) \
    (((__pyx_CyFunctionObject *) (f))->func_classobj)
#define __Pyx_CyFunction_Defaults(type, f) \
    ((type *)(((__pyx_CyFunctionObject *) (f))->defaults))
#define __Pyx_CyFunction_SetDefaultsGetter(f, g) \
    ((__pyx_CyFunctionObject *) (f))->defaults_getter = (g)
typedef struct {
    PyCFunctionObject func;
#if PY_VERSION_HEX < 0x030500A0
    PyObject *func_weakreflist;
#endif
    PyObject *func_dict;
    PyObject *func_name;
    PyObject *func_qualname;
    PyObject *func_doc;
    PyObject *func_globals;
    PyObject *func_code;
    PyObject *func_closure;
    PyObject *func_classobj;
    void *defaults;
    int defaults_pyobjects;
    int flags;
    PyObject *defaults_tuple;
    PyObject *defaults_kwdict;
    PyObject *(*defaults_getter)(PyObject *);
    PyObject *func_annotations;
} __pyx_CyFunctionObject;
static PyTypeObject *__pyx_CyFunctionType = 0;
#define __Pyx_CyFunction_NewEx(ml, flags, qualname, self, module, globals, code) \
    __Pyx_CyFunction_New(__pyx_CyFunctionType, ml, flags, qualname, self, module, globals, code)
static PyObject *__Pyx_CyFunction_New(PyTypeObject *, PyMethodDef *ml,
                                      int flags, PyObject* qualname,
                                      PyObject *self,
                                      PyObject *module, PyObject *globals,
                                      PyObject* code);
static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *m,
                                                         size_t size,
                                                         int pyobjects);
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *m,
                                                            PyObject *tuple);
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *m,
                                                             PyObject *dict);
static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *m,
                                                              PyObject *dict);
static int __Pyx_CyFunction_init(void);

static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void);

static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(
        PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop,
        PyObject** py_start, PyObject** py_stop, PyObject** py_slice,
        int has_cstart, int has_cstop, int wraparound);

#include <string.h>

static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals);

static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals);

#if PY_MAJOR_VERSION >= 3
#define __Pyx_PyString_Equals __Pyx_PyUnicode_Equals
#else
#define __Pyx_PyString_Equals __Pyx_PyBytes_Equals
#endif

static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type);

static CYTHON_INLINE unsigned int __Pyx_abs_int(int x) {
    if (unlikely(x == -INT_MAX-1))
        return ((unsigned int)INT_MAX) + 1U;
    return (unsigned int) abs(x);
}

static CYTHON_INLINE long __Pyx_div_long(long, long); /* proto */

static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname);

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) {
    PyListObject* L = (PyListObject*) list;
    Py_ssize_t len = Py_SIZE(list);
    if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) {
        Py_INCREF(x);
        PyList_SET_ITEM(list, len, x);
        Py_SIZE(list) = len+1;
        return 0;
    }
    return PyList_Append(list, x);
}
#else
#define __Pyx_PyList_Append(L,x) PyList_Append(L,x)
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) {
    PyListObject* L = (PyListObject*) list;
    Py_ssize_t len = Py_SIZE(list);
    if (likely(L->allocated > len)) {
        Py_INCREF(x);
        PyList_SET_ITEM(list, len, x);
        Py_SIZE(list) = len+1;
        return 0;
    }
    return PyList_Append(list, x);
}
#else
#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x)
#endif

#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
    __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) : \
    (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) : \
               __Pyx_GetItemInt_Generic(o, to_py_func(i))))
#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
    __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
    (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL))
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
                                                              int wraparound, int boundscheck);
#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck) \
    (__Pyx_fits_Py_ssize_t(i, type, is_signed) ? \
    __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) : \
    (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL))
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
                                                              int wraparound, int boundscheck);
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j);
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
                                                     int is_list, int wraparound, int boundscheck);

static double __Pyx__PyObject_AsDouble(PyObject* obj);
#if CYTHON_COMPILING_IN_PYPY
#define __Pyx_PyObject_AsDouble(obj) \
(likely(PyFloat_CheckExact(obj)) ? PyFloat_AS_DOUBLE(obj) : \
 likely(PyInt_CheckExact(obj)) ? \
 PyFloat_AsDouble(obj) : __Pyx__PyObject_AsDouble(obj))
#else
#define __Pyx_PyObject_AsDouble(obj) \
((likely(PyFloat_CheckExact(obj))) ? \
 PyFloat_AS_DOUBLE(obj) : __Pyx__PyObject_AsDouble(obj))
#endif

static void __Pyx_WriteUnraisable(const char *name, int clineno,
                                  int lineno, const char *filename,
                                  int full_traceback);

static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name);

static PyObject *__Pyx_GetNameInClass(PyObject *nmspace, PyObject *name);

#if CYTHON_COMPILING_IN_CPYTHON
#define __Pyx_PyObject_DelAttrStr(o,n) __Pyx_PyObject_SetAttrStr(o,n,NULL)
static CYTHON_INLINE int __Pyx_PyObject_SetAttrStr(PyObject* obj, PyObject* attr_name, PyObject* value) {
    PyTypeObject* tp = Py_TYPE(obj);
    if (likely(tp->tp_setattro))
        return tp->tp_setattro(obj, attr_name, value);
#if PY_MAJOR_VERSION < 3
    if (likely(tp->tp_setattr))
        return tp->tp_setattr(obj, PyString_AS_STRING(attr_name), value);
#endif
    return PyObject_SetAttr(obj, attr_name, value);
}
#else
#define __Pyx_PyObject_DelAttrStr(o,n)   PyObject_DelAttr(o,n)
#define __Pyx_PyObject_SetAttrStr(o,n,v) PyObject_SetAttr(o,n,v)
#endif

typedef struct {
    int code_line;
    PyCodeObject* code_object;
} __Pyx_CodeObjectCacheEntry;
struct __Pyx_CodeObjectCache {
    int count;
    int max_count;
    __Pyx_CodeObjectCacheEntry* entries;
};
static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL};
static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line);
static PyCodeObject *__pyx_find_code_object(int code_line);
static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object);

static void __Pyx_AddTraceback(const char *funcname, int c_line,
                               int py_line, const char *filename);

static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level);

static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *);

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value);

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value);

static CYTHON_INLINE long __Pyx_pow_long(long, long); /* proto */

#include "descrobject.h"
static PyObject* __Pyx_Method_ClassMethod(PyObject *method);

static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *);

static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb);

static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg);

#define __Pyx_Generator_USED
#include <structmember.h>
#include <frameobject.h>
typedef PyObject *(*__pyx_generator_body_t)(PyObject *, PyObject *);
typedef struct {
    PyObject_HEAD
    __pyx_generator_body_t body;
    PyObject *closure;
    PyObject *exc_type;
    PyObject *exc_value;
    PyObject *exc_traceback;
    PyObject *gi_weakreflist;
    PyObject *classobj;
    PyObject *yieldfrom;
    PyObject *gi_name;
    PyObject *gi_qualname;
    int resume_label;
    char is_running;
} __pyx_GeneratorObject;
static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
                                                  PyObject *closure, PyObject *name, PyObject *qualname);
static int __pyx_Generator_init(void);
static int __Pyx_Generator_clear(PyObject* self);
#if 1 || PY_VERSION_HEX < 0x030300B0
static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue);
#else
#define __Pyx_PyGen_FetchStopIterationValue(pvalue) PyGen_FetchStopIterationValue(pvalue)
#endif

static int __Pyx_check_binary_version(void);

static int __Pyx_InitStrings(__Pyx_StringTabEntry *t);


/* Module declarations from 'libc.limits' */

/* Module declarations from 'libc.string' */

/* Module declarations from 'libc.stdlib' */

/* Module declarations from 'cpython.long' */

/* Module declarations from 'cpython.ref' */

/* Module declarations from 'cpython.number' */

/* Module declarations from 'libc.stdio' */

/* Module declarations from 'cpython.object' */

/* Module declarations from 'cpython.version' */

/* Module declarations from '_cdecimalfp' */
static PyTypeObject *__pyx_ptype_11_cdecimalfp_Decimal = 0;
static PyTypeObject *__pyx_ptype_11_cdecimalfp___pyx_scope_struct___iterGrouping = 0;
static PyObject *__pyx_v_11_cdecimalfp_PYLONG_10 = 0;
static PyObject *__pyx_v_11_cdecimalfp_LLONG_MAX_LOG10 = 0;
static PyObject *__pyx_f_11_cdecimalfp_base10pow(int); /*proto*/
static void __pyx_f_11_cdecimalfp__dec_from_str(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *, int); /*proto*/
static void __pyx_f_11_cdecimalfp__dec_from_coeff_exp(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *, int, int); /*proto*/
static void __pyx_f_11_cdecimalfp__dec_from_rational(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *, PyObject *, int); /*proto*/
static int __pyx_f_11_cdecimalfp__approx_rational(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *, PyObject *, struct __pyx_opt_args_11_cdecimalfp__approx_rational *__pyx_optional_args); /*proto*/
static void __pyx_f_11_cdecimalfp__adjust(struct __pyx_obj_11_cdecimalfp_Decimal *, int, struct __pyx_opt_args_11_cdecimalfp__adjust *__pyx_optional_args); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp__get_adjusted_value(struct __pyx_obj_11_cdecimalfp_Decimal *, int, struct __pyx_opt_args_11_cdecimalfp__get_adjusted_value *__pyx_optional_args); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp__reduce(struct __pyx_obj_11_cdecimalfp_Decimal *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp__div_rounded(PyObject *, PyObject *, struct __pyx_opt_args_11_cdecimalfp__div_rounded *__pyx_optional_args); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp__int(PyObject *, int); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp__frac(PyObject *, int); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp__div(PyObject *, PyObject *, int); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_add(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_sub(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_mul(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_div1(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_div2(PyObject *, struct __pyx_obj_11_cdecimalfp_Decimal *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_divmod1(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_divmod2(PyObject *, struct __pyx_obj_11_cdecimalfp_Decimal *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_floordiv1(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_floordiv2(PyObject *, struct __pyx_obj_11_cdecimalfp_Decimal *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_mod1(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_mod2(PyObject *, struct __pyx_obj_11_cdecimalfp_Decimal *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_pow1(struct __pyx_obj_11_cdecimalfp_Decimal *, PyObject *); /*proto*/
static PyObject *__pyx_f_11_cdecimalfp_pow2(PyObject *, struct __pyx_obj_11_cdecimalfp_Decimal *); /*proto*/
static int __pyx_f_11_cdecimalfp__round_down(PyObject *, PyObject *, PyObject *); /*proto*/
static int __pyx_f_11_cdecimalfp__round_up(PyObject *, PyObject *, PyObject *); /*proto*/
static int __pyx_f_11_cdecimalfp__round_half_down(PyObject *, PyObject *, PyObject *); /*proto*/
static int __pyx_f_11_cdecimalfp__round_half_up(PyObject *, PyObject *, PyObject *); /*proto*/
static int __pyx_f_11_cdecimalfp__round_half_even(PyObject *, PyObject *, PyObject *); /*proto*/
static CYTHON_INLINE int __pyx_f_11_cdecimalfp__round_ceiling(PyObject *, PyObject *, PyObject *); /*proto*/
static CYTHON_INLINE int __pyx_f_11_cdecimalfp__round_floor(PyObject *, PyObject *, PyObject *); /*proto*/
static int __pyx_f_11_cdecimalfp__round_05up(PyObject *, PyObject *, PyObject *); /*proto*/
static int __pyx_f_11_cdecimalfp__round(PyObject *, PyObject *, PyObject *, struct __pyx_opt_args_11_cdecimalfp__round *__pyx_optional_args); /*proto*/
#define __Pyx_MODULE_NAME "_cdecimalfp"
int __pyx_module_is_main__cdecimalfp = 0;

/* Implementation of '_cdecimalfp' */
static PyObject *__pyx_builtin_property;
static PyObject *__pyx_builtin_TypeError;
static PyObject *__pyx_builtin_ValueError;
static PyObject *__pyx_builtin_AttributeError;
static PyObject *__pyx_builtin_OverflowError;
static PyObject *__pyx_builtin_format;
static PyObject *__pyx_builtin_NotImplemented;
static PyObject *__pyx_builtin_reversed;
static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */
static int __pyx_pf_11_cdecimalfp_7Decimal___cinit__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_value, PyObject *__pyx_v_precision); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_2from_float(PyObject *__pyx_v_cls, PyObject *__pyx_v_f); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_4from_decimal(PyObject *__pyx_v_cls, PyObject *__pyx_v_d); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_6from_real(PyObject *__pyx_v_cls, PyObject *__pyx_v_r, PyObject *__pyx_v_exact); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_8precision(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_10magnitude(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_12numerator(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_14denominator(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_16real(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_18imag(CYTHON_UNUSED struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_20adjusted(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_precision, PyObject *__pyx_v_rounding); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_22as_tuple(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_24as_integer_ratio(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_26__copy__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_28__deepcopy__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_memo); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_30__reduce__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_32__setstate__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_state); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_34__repr__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_36__str__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_38__lstr__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_40__format__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_fmtSpec); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_42_make_comparable(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_other); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_44__richcmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other, int __pyx_v_op); /* proto */
static Py_hash_t __pyx_pf_11_cdecimalfp_7Decimal_46__hash__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static int __pyx_pf_11_cdecimalfp_7Decimal_48__nonzero__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_50__int__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_52__float__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_54__pos__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_56__neg__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_58__abs__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_60__add__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_62__sub__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_64__mul__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */
#if PY_MAJOR_VERSION < 3
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_66__div__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */
#endif
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_68__truediv__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_70__divmod__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_72__floordiv__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_74__mod__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_76__pow__(PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_mod); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_78__floor__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_80__ceil__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_82__round__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_precision); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp__getFormatParams(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_formatSpec); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_2_padDigits(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_digits, PyObject *__pyx_v_minWidth, PyObject *__pyx_v_fill, PyObject *__pyx_v_sep, PyObject *__pyx_v_grouping); /* proto */
static PyObject *__pyx_pf_11_cdecimalfp_4_iterGrouping(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_grouping); /* proto */
static PyObject *__pyx_tp_new_11_cdecimalfp_Decimal(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static PyObject *__pyx_tp_new_11_cdecimalfp___pyx_scope_struct___iterGrouping(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/
static char __pyx_k_0[] = "0";
static char __pyx_k_f[] = "f";
static char __pyx_k_i[] = "%i";
static char __pyx_k_j[] = "j";
static char __pyx_k_l[] = "l";
static char __pyx_k_m[] = "m";
static char __pyx_k_n[] = "n";
static char __pyx_k_r[] = "r";
static char __pyx_k_x[] = "x";
static char __pyx_k_y[] = "y";
static char __pyx_k__4[] = "-";
static char __pyx_k__6[] = "%";
static char __pyx_k__7[] = "";
static char __pyx_k__8[] = "=";
static char __pyx_k_re[] = "re";
static char __pyx_k__27[] = " ";
static char __pyx_k__28[] = "<";
static char __pyx_k__29[] = ".";
static char __pyx_k_exp[] = "exp";
static char __pyx_k_gcd[] = "gcd";
static char __pyx_k_i_2[] = "i";
static char __pyx_k_int[] = "int";
static char __pyx_k_mul[] = "__mul__";
static char __pyx_k_raw[] = "raw";
static char __pyx_k_sep[] = "sep";
static char __pyx_k_Real[] = "Real";
static char __pyx_k_args[] = "args";
static char __pyx_k_copy[] = "__copy__";
static char __pyx_k_fill[] = "fill";
static char __pyx_k_frac[] = "frac";
static char __pyx_k_imag[] = "imag";
static char __pyx_k_join[] = "join";
static char __pyx_k_main[] = "__main__";
static char __pyx_k_math[] = "math";
static char __pyx_k_real[] = "real";
static char __pyx_k_send[] = "send";
static char __pyx_k_sign[] = "sign";
static char __pyx_k_test[] = "__test__";
static char __pyx_k_type[] = "type";
static char __pyx_k_align[] = "align";
static char __pyx_k_close[] = "close";
static char __pyx_k_exact[] = "exact";
static char __pyx_k_floor[] = "floor";
static char __pyx_k_group[] = "group";
static char __pyx_k_lconv[] = "lconv";
static char __pyx_k_limit[] = "limit";
static char __pyx_k_log10[] = "log10";
static char __pyx_k_match[] = "match";
static char __pyx_k_s_s_i[] = "%s%s%i";
static char __pyx_k_s_s_s[] = "'%s%s.%s'";
static char __pyx_k_throw[] = "throw";
static char __pyx_k_value[] = "value";
static char __pyx_k_digits[] = "digits";
static char __pyx_k_divmod[] = "__divmod__";
static char __pyx_k_encode[] = "encode";
static char __pyx_k_format[] = "format";
static char __pyx_k_import[] = "__import__";
static char __pyx_k_locale[] = "locale";
static char __pyx_k_py_str[] = "py_str";
static char __pyx_k_reduce[] = "reduce";
static char __pyx_k_s0_s_s[] = "'%s0.%s%s'";
static char __pyx_k_slices[] = "slices";
static char __pyx_k_Complex[] = "Complex";
static char __pyx_k_Decimal[] = "Decimal";
static char __pyx_k_VERBOSE[] = "VERBOSE";
static char __pyx_k_compile[] = "compile";
static char __pyx_k_decimal[] = "decimal";
static char __pyx_k_fmtFill[] = "fmtFill";
static char __pyx_k_fmtSign[] = "fmtSign";
static char __pyx_k_fmtType[] = "fmtType";
static char __pyx_k_nDigits[] = "nDigits";
static char __pyx_k_numbers[] = "numbers";
static char __pyx_k_pattern[] = "_pattern";
static char __pyx_k_s_i_0_i[] = "%s%i.%0*i";
static char __pyx_k_zeropad[] = "zeropad";
static char __pyx_k_CHAR_MAX[] = "CHAR_MAX";
static char __pyx_k_Fraction[] = "Fraction";
static char __pyx_k_Integral[] = "Integral";
static char __pyx_k_ROUND_UP[] = "ROUND_UP";
static char __pyx_k_Rational[] = "Rational";
static char __pyx_k_adjusted[] = "adjusted";
static char __pyx_k_as_tuple[] = "as_tuple";
static char __pyx_k_fmtAlign[] = "fmtAlign";
static char __pyx_k_format_2[] = "__format__";
static char __pyx_k_grouping[] = "grouping";
static char __pyx_k_minWidth[] = "minWidth";
static char __pyx_k_onlyfrac[] = "onlyfrac";
static char __pyx_k_property[] = "property";
static char __pyx_k_py_bytes[] = "py_bytes";
static char __pyx_k_register[] = "register";
static char __pyx_k_reversed[] = "reversed";
static char __pyx_k_rounding[] = "rounding";
static char __pyx_k_Decimal_s[] = "Decimal(%s)";
static char __pyx_k_TypeError[] = "TypeError";
static char __pyx_k_decimalfp[] = "decimalfp";
static char __pyx_k_fractions[] = "fractions";
static char __pyx_k_from_real[] = "from_real";
static char __pyx_k_functools[] = "functools";
static char __pyx_k_is_finite[] = "is_finite";
static char __pyx_k_magnitude[] = "magnitude";
static char __pyx_k_numerator[] = "numerator";
static char __pyx_k_padDigits[] = "_padDigits";
static char __pyx_k_precision[] = "precision";
static char __pyx_k_str_types[] = "str_types";
static char __pyx_k_ROUND_05UP[] = "ROUND_05UP";
static char __pyx_k_ROUND_DOWN[] = "ROUND_DOWN";
static char __pyx_k_ValueError[] = "ValueError";
static char __pyx_k_cdecimalfp[] = "_cdecimalfp";
static char __pyx_k_formatSpec[] = "formatSpec";
static char __pyx_k_from_float[] = "from_float";
static char __pyx_k_localeconv[] = "localeconv";
static char __pyx_k_Decimal_s_s[] = "Decimal(%s, %s)";
static char __pyx_k_ROUND_FLOOR[] = "ROUND_FLOOR";
static char __pyx_k_denominator[] = "denominator";
static char __pyx_k_fmtGrouping[] = "fmtGrouping";
static char __pyx_k_fmtMinWidth[] = "fmtMinWidth";
static char __pyx_k_parseString[] = "_parseString";
static char __pyx_k_fmtPrecision[] = "fmtPrecision";
static char __pyx_k_from_decimal[] = "from_decimal";
static char __pyx_k_get_rounding[] = "get_rounding";
static char __pyx_k_iterGrouping[] = "_iterGrouping";
static char __pyx_k_minimumwidth[] = "minimumwidth";
static char __pyx_k_DFLT_ROUNDING[] = "DFLT_ROUNDING";
static char __pyx_k_OverflowError[] = "OverflowError";
static char __pyx_k_ROUND_CEILING[] = "ROUND_CEILING";
static char __pyx_k_ROUND_HALF_UP[] = "ROUND_HALF_UP";
static char __pyx_k_StdLibDecimal[] = "_StdLibDecimal";
static char __pyx_k_decimal_point[] = "decimal_point";
static char __pyx_k_thousands_sep[] = "thousands_sep";
static char __pyx_k_AttributeError[] = "AttributeError";
static char __pyx_k_NotImplemented[] = "NotImplemented";
static char __pyx_k_get_limit_prec[] = "_get_limit_prec";
static char __pyx_k_ROUND_HALF_DOWN[] = "ROUND_HALF_DOWN";
static char __pyx_k_ROUND_HALF_EVEN[] = "ROUND_HALF_EVEN";
static char __pyx_k_fmtDecimalPoint[] = "fmtDecimalPoint";
static char __pyx_k_fmtThousandsSep[] = "fmtThousandsSep";
static char __pyx_k_getFormatParams[] = "_getFormatParams";
static char __pyx_k_make_comparable[] = "_make_comparable";
static char __pyx_k_parseFormatSpec[] = "_parseFormatSpec";
static char __pyx_k_s_is_not_a_Real[] = "%s is not a Real.";
static char __pyx_k_as_integer_ratio[] = "as_integer_ratio";
static char __pyx_k_dfltFormatParams[] = "_dfltFormatParams";
static char __pyx_k_s_is_not_a_float[] = "%s is not a float.";
static char __pyx_k_s_is_not_a_Decimal[] = "%s is not a Decimal.";
static char __pyx_k_Precision_must_be_0[] = "Precision must be >= 0.";
static char __pyx_k_cinit___locals_lambda[] = "__cinit__.<locals>.<lambda>";
static char __pyx_k_Invalid_format_specifier[] = "Invalid format specifier: ";
static char __pyx_k_Can_t_convert_s_to_Decimal[] = "Can't convert %s to Decimal.";
static char __pyx_k_Precision_must_be_of_type_int[] = "Precision must be of <type 'int'>.";
static char __pyx_k_Decimal_fixed_point_arithmetic[] = "Decimal fixed-point arithmetic.";
static char __pyx_k_3rd_argument_not_allowed_unless[] = "3rd argument not allowed unless all arguments are integers";
static char __pyx_k_A_P_fill_P_align_P_sign_P_zerop[] = "\n            \\A\n            (?:\n                (?P<fill>.)?\n                (?P<align>[<>=^])\n            )?\n            (?P<sign>[-+ ])?\n            (?P<zeropad>0)?\n            (?P<minimumwidth>(?!0)\\d+)?\n            (?P<thousands_sep>,)?\n            (?:\\.(?P<precision>0|(?!0)\\d+))?\n            (?P<type>[fFn%])?\n            \\Z\n            ";
static char __pyx_k_home_ma_work_decimalfp_work__cd[] = "/home/ma/work/decimalfp.work/_cdecimalfp.pyx";
static char __pyx_k_s_P_sign_P_int_d_P_frac_d_P_onl[] = "\n            \\s*\n            (?P<sign>[+|-])?\n            (\n                (?P<int>\\d+)(\\.(?P<frac>\\d*))?\n                |\n                \\.(?P<onlyfrac>\\d+)\n            )\n            ([eE](?P<exp>[+|-]?\\d+))?\n            \\s*$\n            ";
static char __pyx_k_Can_t_convert_s_exactly_to_Decim[] = "Can't convert %s exactly to Decimal.";
static PyObject *__pyx_kp_s_0;
static PyObject *__pyx_kp_s_3rd_argument_not_allowed_unless;
static PyObject *__pyx_kp_s_A_P_fill_P_align_P_sign_P_zerop;
static PyObject *__pyx_n_s_AttributeError;
static PyObject *__pyx_n_s_CHAR_MAX;
static PyObject *__pyx_kp_s_Can_t_convert_s_exactly_to_Decim;
static PyObject *__pyx_kp_s_Can_t_convert_s_to_Decimal;
static PyObject *__pyx_n_s_Complex;
static PyObject *__pyx_n_s_DFLT_ROUNDING;
static PyObject *__pyx_n_s_Decimal;
static PyObject *__pyx_kp_s_Decimal_s;
static PyObject *__pyx_kp_s_Decimal_s_s;
static PyObject *__pyx_n_s_Fraction;
static PyObject *__pyx_n_s_Integral;
static PyObject *__pyx_kp_s_Invalid_format_specifier;
static PyObject *__pyx_n_s_NotImplemented;
static PyObject *__pyx_n_s_OverflowError;
static PyObject *__pyx_kp_s_Precision_must_be_0;
static PyObject *__pyx_kp_s_Precision_must_be_of_type_int;
static PyObject *__pyx_n_s_ROUND_05UP;
static PyObject *__pyx_n_s_ROUND_CEILING;
static PyObject *__pyx_n_s_ROUND_DOWN;
static PyObject *__pyx_n_s_ROUND_FLOOR;
static PyObject *__pyx_n_s_ROUND_HALF_DOWN;
static PyObject *__pyx_n_s_ROUND_HALF_EVEN;
static PyObject *__pyx_n_s_ROUND_HALF_UP;
static PyObject *__pyx_n_s_ROUND_UP;
static PyObject *__pyx_n_s_Rational;
static PyObject *__pyx_n_s_Real;
static PyObject *__pyx_n_s_StdLibDecimal;
static PyObject *__pyx_n_s_TypeError;
static PyObject *__pyx_n_s_VERBOSE;
static PyObject *__pyx_n_s_ValueError;
static PyObject *__pyx_kp_s__27;
static PyObject *__pyx_kp_s__28;
static PyObject *__pyx_kp_s__29;
static PyObject *__pyx_kp_b__4;
static PyObject *__pyx_kp_s__4;
static PyObject *__pyx_kp_s__6;
static PyObject *__pyx_kp_b__7;
static PyObject *__pyx_kp_s__7;
static PyObject *__pyx_kp_u__7;
static PyObject *__pyx_kp_s__8;
static PyObject *__pyx_n_s_adjusted;
static PyObject *__pyx_n_s_align;
static PyObject *__pyx_n_s_args;
static PyObject *__pyx_n_s_as_integer_ratio;
static PyObject *__pyx_n_s_as_tuple;
static PyObject *__pyx_n_s_cdecimalfp;
static PyObject *__pyx_n_s_cinit___locals_lambda;
static PyObject *__pyx_n_s_close;
static PyObject *__pyx_n_s_compile;
static PyObject *__pyx_n_s_copy;
static PyObject *__pyx_n_s_decimal;
static PyObject *__pyx_n_s_decimal_point;
static PyObject *__pyx_n_s_decimalfp;
static PyObject *__pyx_n_s_denominator;
static PyObject *__pyx_n_s_dfltFormatParams;
static PyObject *__pyx_n_s_digits;
static PyObject *__pyx_n_s_divmod;
static PyObject *__pyx_n_s_encode;
static PyObject *__pyx_n_s_exact;
static PyObject *__pyx_n_s_exp;
static PyObject *__pyx_n_s_f;
static PyObject *__pyx_n_s_fill;
static PyObject *__pyx_n_s_floor;
static PyObject *__pyx_n_s_fmtAlign;
static PyObject *__pyx_n_s_fmtDecimalPoint;
static PyObject *__pyx_n_s_fmtFill;
static PyObject *__pyx_n_s_fmtGrouping;
static PyObject *__pyx_n_s_fmtMinWidth;
static PyObject *__pyx_n_s_fmtPrecision;
static PyObject *__pyx_n_s_fmtSign;
static PyObject *__pyx_n_s_fmtThousandsSep;
static PyObject *__pyx_n_s_fmtType;
static PyObject *__pyx_n_s_format;
static PyObject *__pyx_n_s_formatSpec;
static PyObject *__pyx_n_s_format_2;
static PyObject *__pyx_n_s_frac;
static PyObject *__pyx_n_s_fractions;
static PyObject *__pyx_n_s_from_decimal;
static PyObject *__pyx_n_s_from_float;
static PyObject *__pyx_n_s_from_real;
static PyObject *__pyx_n_s_functools;
static PyObject *__pyx_n_s_gcd;
static PyObject *__pyx_n_s_getFormatParams;
static PyObject *__pyx_n_s_get_limit_prec;
static PyObject *__pyx_n_s_get_rounding;
static PyObject *__pyx_n_s_group;
static PyObject *__pyx_n_s_grouping;
static PyObject *__pyx_kp_s_home_ma_work_decimalfp_work__cd;
static PyObject *__pyx_kp_s_i;
static PyObject *__pyx_n_s_i_2;
static PyObject *__pyx_n_s_imag;
static PyObject *__pyx_n_s_import;
static PyObject *__pyx_n_s_int;
static PyObject *__pyx_n_s_is_finite;
static PyObject *__pyx_n_s_iterGrouping;
static PyObject *__pyx_n_s_j;
static PyObject *__pyx_n_s_join;
static PyObject *__pyx_n_s_l;
static PyObject *__pyx_n_s_lconv;
static PyObject *__pyx_n_s_limit;
static PyObject *__pyx_n_s_locale;
static PyObject *__pyx_n_s_localeconv;
static PyObject *__pyx_n_s_log10;
static PyObject *__pyx_n_s_m;
static PyObject *__pyx_n_s_magnitude;
static PyObject *__pyx_n_s_main;
static PyObject *__pyx_n_s_make_comparable;
static PyObject *__pyx_n_s_match;
static PyObject *__pyx_n_s_math;
static PyObject *__pyx_n_s_minWidth;
static PyObject *__pyx_n_s_minimumwidth;
static PyObject *__pyx_n_s_mul;
static PyObject *__pyx_n_s_n;
static PyObject *__pyx_n_s_nDigits;
static PyObject *__pyx_n_s_numbers;
static PyObject *__pyx_n_s_numerator;
static PyObject *__pyx_n_s_onlyfrac;
static PyObject *__pyx_n_s_padDigits;
static PyObject *__pyx_n_s_parseFormatSpec;
static PyObject *__pyx_n_s_parseString;
static PyObject *__pyx_n_s_pattern;
static PyObject *__pyx_n_s_precision;
static PyObject *__pyx_n_s_property;
static PyObject *__pyx_n_s_py_bytes;
static PyObject *__pyx_n_s_py_str;
static PyObject *__pyx_n_s_r;
static PyObject *__pyx_n_s_raw;
static PyObject *__pyx_n_s_re;
static PyObject *__pyx_n_s_real;
static PyObject *__pyx_n_s_reduce;
static PyObject *__pyx_n_s_register;
static PyObject *__pyx_n_s_reversed;
static PyObject *__pyx_n_s_rounding;
static PyObject *__pyx_kp_s_s0_s_s;
static PyObject *__pyx_kp_s_s_P_sign_P_int_d_P_frac_d_P_onl;
static PyObject *__pyx_kp_s_s_i_0_i;
static PyObject *__pyx_kp_s_s_is_not_a_Decimal;
static PyObject *__pyx_kp_s_s_is_not_a_Real;
static PyObject *__pyx_kp_s_s_is_not_a_float;
static PyObject *__pyx_kp_s_s_s_i;
static PyObject *__pyx_kp_s_s_s_s;
static PyObject *__pyx_n_s_send;
static PyObject *__pyx_n_s_sep;
static PyObject *__pyx_n_s_sign;
static PyObject *__pyx_n_s_slices;
static PyObject *__pyx_n_s_str_types;
static PyObject *__pyx_n_s_test;
static PyObject *__pyx_n_s_thousands_sep;
static PyObject *__pyx_n_s_throw;
static PyObject *__pyx_n_s_type;
static PyObject *__pyx_n_s_value;
static PyObject *__pyx_n_s_x;
static PyObject *__pyx_n_s_y;
static PyObject *__pyx_n_s_zeropad;
static PyObject *__pyx_int_0;
static PyObject *__pyx_int_1;
static PyObject *__pyx_int_2;
static PyObject *__pyx_int_3;
static PyObject *__pyx_int_5;
static PyObject *__pyx_int_10;
static PyObject *__pyx_int_neg_1;
static PyObject *__pyx_tuple_;
static PyObject *__pyx_tuple__2;
static PyObject *__pyx_tuple__3;
static PyObject *__pyx_tuple__5;
static PyObject *__pyx_tuple__9;
static PyObject *__pyx_slice__25;
static PyObject *__pyx_tuple__10;
static PyObject *__pyx_tuple__11;
static PyObject *__pyx_tuple__12;
static PyObject *__pyx_tuple__13;
static PyObject *__pyx_tuple__14;
static PyObject *__pyx_tuple__15;
static PyObject *__pyx_tuple__16;
static PyObject *__pyx_tuple__17;
static PyObject *__pyx_tuple__18;
static PyObject *__pyx_tuple__19;
static PyObject *__pyx_tuple__20;
static PyObject *__pyx_tuple__21;
static PyObject *__pyx_tuple__22;
static PyObject *__pyx_tuple__23;
static PyObject *__pyx_tuple__24;
static PyObject *__pyx_tuple__26;
static PyObject *__pyx_tuple__30;
static PyObject *__pyx_tuple__32;
static PyObject *__pyx_tuple__34;
static PyObject *__pyx_codeobj__31;
static PyObject *__pyx_codeobj__33;
static PyObject *__pyx_codeobj__35;

/* "_cdecimalfp.pyx":107
 *     cdef int _precision
 * 
 *     def __cinit__(self, object value=None, object precision=None):             # <<<<<<<<<<<<<<
 * 
 *         cdef object num, den
 */

/* Python wrapper */
static int __pyx_pw_11_cdecimalfp_7Decimal_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static int __pyx_pw_11_cdecimalfp_7Decimal_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_value = 0;
  PyObject *__pyx_v_precision = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_value,&__pyx_n_s_precision,0};
    PyObject* values[2] = {0,0};
    values[0] = ((PyObject *)Py_None);
    values[1] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_value);
          if (value) { values[0] = value; kw_args--; }
        }
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__cinit__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_value = values[0];
    __pyx_v_precision = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__cinit__", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 107; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return -1;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal___cinit__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self), __pyx_v_value, __pyx_v_precision);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":164
 *             if value.is_finite():
 *                 sign, digits, exp = value.as_tuple()
 *                 coeff = (-1) ** sign * reduce(lambda x, y: x * 10 + y, digits)             # <<<<<<<<<<<<<<
 *                 prec = -1 if precision is None else precision
 *                 _dec_from_coeff_exp(self, coeff, exp, prec)
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_9__cinit___lambda1(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_11_cdecimalfp_7Decimal_9__cinit___lambda1 = {"lambda1", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_9__cinit___lambda1, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_9__cinit___lambda1(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_x = 0;
  PyObject *__pyx_v_y = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("lambda1 (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_x,&__pyx_n_s_y,0};
    PyObject* values[2] = {0,0};
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_x)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_y)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("lambda1", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "lambda1") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else if (PyTuple_GET_SIZE(__pyx_args) != 2) {
      goto __pyx_L5_argtuple_error;
    } else {
      values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
      values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
    }
    __pyx_v_x = values[0];
    __pyx_v_y = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("lambda1", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__cinit__.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_lambda_funcdef_lambda1(__pyx_self, __pyx_v_x, __pyx_v_y);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_lambda_funcdef_lambda1(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("lambda1", 0);
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyNumber_Multiply(__pyx_v_x, __pyx_int_10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Add(__pyx_t_1, __pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__cinit__.lambda1", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":107
 *     cdef int _precision
 * 
 *     def __cinit__(self, object value=None, object precision=None):             # <<<<<<<<<<<<<<
 * 
 *         cdef object num, den
 */

static int __pyx_pf_11_cdecimalfp_7Decimal___cinit__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_value, PyObject *__pyx_v_precision) {
  PyObject *__pyx_v_num = 0;
  PyObject *__pyx_v_den = 0;
  int __pyx_v_prec;
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_dec = 0;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_v_lValue = NULL;
  PyObject *__pyx_v_sign = NULL;
  PyObject *__pyx_v_digits = NULL;
  PyObject *__pyx_v_exp = NULL;
  PyObject *__pyx_v_coeff = NULL;
  PyObject *__pyx_v_ev = NULL;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *__pyx_t_12 = NULL;
  PyObject *__pyx_t_13 = NULL;
  PyObject *(*__pyx_t_14)(PyObject *);
  Py_ssize_t __pyx_t_15;
  PyObject *__pyx_t_16 = NULL;
  PyObject *__pyx_t_17 = NULL;
  PyObject *__pyx_t_18 = NULL;
  PyObject *__pyx_t_19 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__cinit__", 0);

  /* "_cdecimalfp.pyx":113
 *         cdef Decimal dec
 * 
 *         if precision is None:             # <<<<<<<<<<<<<<
 *             if value is None:
 *                 self._value = 0
 */
  __pyx_t_1 = (__pyx_v_precision == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":114
 * 
 *         if precision is None:
 *             if value is None:             # <<<<<<<<<<<<<<
 *                 self._value = 0
 *                 self._precision = 0
 */
    __pyx_t_2 = (__pyx_v_value == Py_None);
    __pyx_t_1 = (__pyx_t_2 != 0);
    if (__pyx_t_1) {

      /* "_cdecimalfp.pyx":115
 *         if precision is None:
 *             if value is None:
 *                 self._value = 0             # <<<<<<<<<<<<<<
 *                 self._precision = 0
 *                 return
 */
      __Pyx_INCREF(__pyx_int_0);
      __Pyx_GIVEREF(__pyx_int_0);
      __Pyx_GOTREF(__pyx_v_self->_value);
      __Pyx_DECREF(__pyx_v_self->_value);
      __pyx_v_self->_value = __pyx_int_0;

      /* "_cdecimalfp.pyx":116
 *             if value is None:
 *                 self._value = 0
 *                 self._precision = 0             # <<<<<<<<<<<<<<
 *                 return
 *         else:
 */
      __pyx_v_self->_precision = 0;

      /* "_cdecimalfp.pyx":117
 *                 self._value = 0
 *                 self._precision = 0
 *                 return             # <<<<<<<<<<<<<<
 *         else:
 *             if not isinstance(precision, int):
 */
      __pyx_r = 0;
      goto __pyx_L0;
    }
    goto __pyx_L3;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":119
 *                 return
 *         else:
 *             if not isinstance(precision, int):             # <<<<<<<<<<<<<<
 *                 raise TypeError("Precision must be of <type 'int'>.")
 *             if precision < 0:
 */
    __pyx_t_1 = PyInt_Check(__pyx_v_precision); 
    __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0);
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":120
 *         else:
 *             if not isinstance(precision, int):
 *                 raise TypeError("Precision must be of <type 'int'>.")             # <<<<<<<<<<<<<<
 *             if precision < 0:
 *                 raise ValueError("Precision must be >= 0.")
 */
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }

    /* "_cdecimalfp.pyx":121
 *             if not isinstance(precision, int):
 *                 raise TypeError("Precision must be of <type 'int'>.")
 *             if precision < 0:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Precision must be >= 0.")
 *             if value is None:
 */
    __pyx_t_3 = PyObject_RichCompare(__pyx_v_precision, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":122
 *                 raise TypeError("Precision must be of <type 'int'>.")
 *             if precision < 0:
 *                 raise ValueError("Precision must be >= 0.")             # <<<<<<<<<<<<<<
 *             if value is None:
 *                 self._value = 0
 */
      __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_Raise(__pyx_t_3, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }

    /* "_cdecimalfp.pyx":123
 *             if precision < 0:
 *                 raise ValueError("Precision must be >= 0.")
 *             if value is None:             # <<<<<<<<<<<<<<
 *                 self._value = 0
 *                 self._precision = precision
 */
    __pyx_t_2 = (__pyx_v_value == Py_None);
    __pyx_t_1 = (__pyx_t_2 != 0);
    if (__pyx_t_1) {

      /* "_cdecimalfp.pyx":124
 *                 raise ValueError("Precision must be >= 0.")
 *             if value is None:
 *                 self._value = 0             # <<<<<<<<<<<<<<
 *                 self._precision = precision
 *                 return
 */
      __Pyx_INCREF(__pyx_int_0);
      __Pyx_GIVEREF(__pyx_int_0);
      __Pyx_GOTREF(__pyx_v_self->_value);
      __Pyx_DECREF(__pyx_v_self->_value);
      __pyx_v_self->_value = __pyx_int_0;

      /* "_cdecimalfp.pyx":125
 *             if value is None:
 *                 self._value = 0
 *                 self._precision = precision             # <<<<<<<<<<<<<<
 *                 return
 * 
 */
      __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_precision); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 125; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_v_self->_precision = __pyx_t_4;

      /* "_cdecimalfp.pyx":126
 *                 self._value = 0
 *                 self._precision = precision
 *                 return             # <<<<<<<<<<<<<<
 * 
 *         # Decimal
 */
      __pyx_r = 0;
      goto __pyx_L0;
    }
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":129
 * 
 *         # Decimal
 *         if isinstance(value, Decimal):             # <<<<<<<<<<<<<<
 *             self._precision = prec = (<Decimal>value)._precision
 *             self._value = (<Decimal>value)._value
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_value, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":130
 *         # Decimal
 *         if isinstance(value, Decimal):
 *             self._precision = prec = (<Decimal>value)._precision             # <<<<<<<<<<<<<<
 *             self._value = (<Decimal>value)._value
 *             if precision is not None and precision != prec:
 */
    __pyx_t_4 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_value)->_precision;
    __pyx_v_self->_precision = __pyx_t_4;
    __pyx_v_prec = __pyx_t_4;

    /* "_cdecimalfp.pyx":131
 *         if isinstance(value, Decimal):
 *             self._precision = prec = (<Decimal>value)._precision
 *             self._value = (<Decimal>value)._value             # <<<<<<<<<<<<<<
 *             if precision is not None and precision != prec:
 *                 _adjust(self, precision)
 */
    __pyx_t_3 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_value)->_value;
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_3);
    __Pyx_GOTREF(__pyx_v_self->_value);
    __Pyx_DECREF(__pyx_v_self->_value);
    __pyx_v_self->_value = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "_cdecimalfp.pyx":132
 *             self._precision = prec = (<Decimal>value)._precision
 *             self._value = (<Decimal>value)._value
 *             if precision is not None and precision != prec:             # <<<<<<<<<<<<<<
 *                 _adjust(self, precision)
 *             return
 */
    __pyx_t_1 = (__pyx_v_precision != Py_None);
    __pyx_t_5 = (__pyx_t_1 != 0);
    if (__pyx_t_5) {
    } else {
      __pyx_t_2 = __pyx_t_5;
      goto __pyx_L10_bool_binop_done;
    }
    __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_v_prec); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_6 = PyObject_RichCompare(__pyx_v_precision, __pyx_t_3, Py_NE); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_2 = __pyx_t_5;
    __pyx_L10_bool_binop_done:;
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":133
 *             self._value = (<Decimal>value)._value
 *             if precision is not None and precision != prec:
 *                 _adjust(self, precision)             # <<<<<<<<<<<<<<
 *             return
 * 
 */
      __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_precision); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_f_11_cdecimalfp__adjust(__pyx_v_self, __pyx_t_4, NULL); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 133; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      goto __pyx_L9;
    }
    __pyx_L9:;

    /* "_cdecimalfp.pyx":134
 *             if precision is not None and precision != prec:
 *                 _adjust(self, precision)
 *             return             # <<<<<<<<<<<<<<
 * 
 *         # String
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":137
 * 
 *         # String
 *         if isinstance(value, str_types):             # <<<<<<<<<<<<<<
 *             prec = -1 if precision is None else precision
 *             try:
 */
  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_str_types); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_value, __pyx_t_6); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 137; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_5 = (__pyx_t_2 != 0);
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":138
 *         # String
 *         if isinstance(value, str_types):
 *             prec = -1 if precision is None else precision             # <<<<<<<<<<<<<<
 *             try:
 *                 s = value.encode()
 */
    __pyx_t_5 = (__pyx_v_precision == Py_None);
    if ((__pyx_t_5 != 0)) {
      __pyx_t_4 = -1;
    } else {
      __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_v_precision); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 138; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_4 = __pyx_t_7;
    }
    __pyx_v_prec = __pyx_t_4;

    /* "_cdecimalfp.pyx":139
 *         if isinstance(value, str_types):
 *             prec = -1 if precision is None else precision
 *             try:             # <<<<<<<<<<<<<<
 *                 s = value.encode()
 *             except AttributeError:
 */
    {
      __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);
      __Pyx_XGOTREF(__pyx_t_8);
      __Pyx_XGOTREF(__pyx_t_9);
      __Pyx_XGOTREF(__pyx_t_10);
      /*try:*/ {

        /* "_cdecimalfp.pyx":140
 *             prec = -1 if precision is None else precision
 *             try:
 *                 s = value.encode()             # <<<<<<<<<<<<<<
 *             except AttributeError:
 *                 s = value
 */
        __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_encode); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L13_error;}
        __Pyx_GOTREF(__pyx_t_3);
        __pyx_t_11 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
          __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_3);
          if (likely(__pyx_t_11)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
            __Pyx_INCREF(__pyx_t_11);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_3, function);
          }
        }
        if (__pyx_t_11) {
          __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_11); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L13_error;}
          __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        } else {
          __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 140; __pyx_clineno = __LINE__; goto __pyx_L13_error;}
        }
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __pyx_v_s = __pyx_t_6;
        __pyx_t_6 = 0;
      }
      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
      goto __pyx_L20_try_end;
      __pyx_L13_error:;
      __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;

      /* "_cdecimalfp.pyx":141
 *             try:
 *                 s = value.encode()
 *             except AttributeError:             # <<<<<<<<<<<<<<
 *                 s = value
 *             try:
 */
      __pyx_t_4 = PyErr_ExceptionMatches(__pyx_builtin_AttributeError);
      if (__pyx_t_4) {
        __Pyx_AddTraceback("_cdecimalfp.Decimal.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
        if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_3, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L15_except_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_GOTREF(__pyx_t_11);

        /* "_cdecimalfp.pyx":142
 *                 s = value.encode()
 *             except AttributeError:
 *                 s = value             # <<<<<<<<<<<<<<
 *             try:
 *                 _dec_from_str(self, s, prec)
 */
        __Pyx_INCREF(__pyx_v_value);
        __Pyx_XDECREF_SET(__pyx_v_s, __pyx_v_value);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        goto __pyx_L14_exception_handled;
      }
      goto __pyx_L15_except_error;
      __pyx_L15_except_error:;
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_XGIVEREF(__pyx_t_10);
      __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10);
      goto __pyx_L1_error;
      __pyx_L14_exception_handled:;
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_XGIVEREF(__pyx_t_10);
      __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10);
      __pyx_L20_try_end:;
    }

    /* "_cdecimalfp.pyx":143
 *             except AttributeError:
 *                 s = value
 *             try:             # <<<<<<<<<<<<<<
 *                 _dec_from_str(self, s, prec)
 *             except ValueError:
 */
    {
      __Pyx_ExceptionSave(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8);
      __Pyx_XGOTREF(__pyx_t_10);
      __Pyx_XGOTREF(__pyx_t_9);
      __Pyx_XGOTREF(__pyx_t_8);
      /*try:*/ {

        /* "_cdecimalfp.pyx":144
 *                 s = value
 *             try:
 *                 _dec_from_str(self, s, prec)             # <<<<<<<<<<<<<<
 *             except ValueError:
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))
 */
        if (!(likely(PyBytes_CheckExact(__pyx_v_s))||((__pyx_v_s) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_v_s)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L23_error;}
        __pyx_f_11_cdecimalfp__dec_from_str(__pyx_v_self, ((PyObject*)__pyx_v_s), __pyx_v_prec); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 144; __pyx_clineno = __LINE__; goto __pyx_L23_error;}
      }
      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
      goto __pyx_L30_try_end;
      __pyx_L23_error:;
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;

      /* "_cdecimalfp.pyx":145
 *             try:
 *                 _dec_from_str(self, s, prec)
 *             except ValueError:             # <<<<<<<<<<<<<<
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))
 *             return
 */
      __pyx_t_4 = PyErr_ExceptionMatches(__pyx_builtin_ValueError);
      if (__pyx_t_4) {
        __Pyx_AddTraceback("_cdecimalfp.Decimal.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
        if (__Pyx_GetException(&__pyx_t_11, &__pyx_t_3, &__pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 145; __pyx_clineno = __LINE__; goto __pyx_L25_except_error;}
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_GOTREF(__pyx_t_6);

        /* "_cdecimalfp.pyx":146
 *                 _dec_from_str(self, s, prec)
 *             except ValueError:
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))             # <<<<<<<<<<<<<<
 *             return
 * 
 */
        __pyx_t_12 = PyObject_Repr(__pyx_v_value); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L25_except_error;}
        __Pyx_GOTREF(__pyx_t_12);
        __pyx_t_13 = __Pyx_PyString_Format(__pyx_kp_s_Can_t_convert_s_to_Decimal, __pyx_t_12); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L25_except_error;}
        __Pyx_GOTREF(__pyx_t_13);
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __pyx_t_12 = PyTuple_New(1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L25_except_error;}
        __Pyx_GOTREF(__pyx_t_12);
        PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_13);
        __Pyx_GIVEREF(__pyx_t_13);
        __pyx_t_13 = 0;
        __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_12, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L25_except_error;}
        __Pyx_GOTREF(__pyx_t_13);
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_Raise(__pyx_t_13, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 146; __pyx_clineno = __LINE__; goto __pyx_L25_except_error;}
      }
      goto __pyx_L25_except_error;
      __pyx_L25_except_error:;
      __Pyx_XGIVEREF(__pyx_t_10);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_9, __pyx_t_8);
      goto __pyx_L1_error;
      __pyx_L30_try_end:;
    }

    /* "_cdecimalfp.pyx":147
 *             except ValueError:
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))
 *             return             # <<<<<<<<<<<<<<
 * 
 *         # Integral
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":150
 * 
 *         # Integral
 *         if isinstance(value, numbers.Integral):             # <<<<<<<<<<<<<<
 *             lValue = PyNumber_Long(value)
 *             if precision is None:
 */
  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_Integral); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_5 = PyObject_IsInstance(__pyx_v_value, __pyx_t_3); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_2 = (__pyx_t_5 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":151
 *         # Integral
 *         if isinstance(value, numbers.Integral):
 *             lValue = PyNumber_Long(value)             # <<<<<<<<<<<<<<
 *             if precision is None:
 *                 self._precision = 0
 */
    __pyx_t_3 = PyNumber_Long(__pyx_v_value); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 151; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_v_lValue = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "_cdecimalfp.pyx":152
 *         if isinstance(value, numbers.Integral):
 *             lValue = PyNumber_Long(value)
 *             if precision is None:             # <<<<<<<<<<<<<<
 *                 self._precision = 0
 *                 self._value = lValue
 */
    __pyx_t_2 = (__pyx_v_precision == Py_None);
    __pyx_t_5 = (__pyx_t_2 != 0);
    if (__pyx_t_5) {

      /* "_cdecimalfp.pyx":153
 *             lValue = PyNumber_Long(value)
 *             if precision is None:
 *                 self._precision = 0             # <<<<<<<<<<<<<<
 *                 self._value = lValue
 *             else:
 */
      __pyx_v_self->_precision = 0;

      /* "_cdecimalfp.pyx":154
 *             if precision is None:
 *                 self._precision = 0
 *                 self._value = lValue             # <<<<<<<<<<<<<<
 *             else:
 *                 self._precision = precision
 */
      __Pyx_INCREF(__pyx_v_lValue);
      __Pyx_GIVEREF(__pyx_v_lValue);
      __Pyx_GOTREF(__pyx_v_self->_value);
      __Pyx_DECREF(__pyx_v_self->_value);
      __pyx_v_self->_value = __pyx_v_lValue;
      goto __pyx_L34;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":156
 *                 self._value = lValue
 *             else:
 *                 self._precision = precision             # <<<<<<<<<<<<<<
 *                 self._value = lValue * base10pow(precision)
 *             return
 */
      __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_precision); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_v_self->_precision = __pyx_t_4;

      /* "_cdecimalfp.pyx":157
 *             else:
 *                 self._precision = precision
 *                 self._value = lValue * base10pow(precision)             # <<<<<<<<<<<<<<
 *             return
 * 
 */
      __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_precision); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_3 = __pyx_f_11_cdecimalfp_base10pow(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = PyNumber_Multiply(__pyx_v_lValue, __pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 157; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_GIVEREF(__pyx_t_6);
      __Pyx_GOTREF(__pyx_v_self->_value);
      __Pyx_DECREF(__pyx_v_self->_value);
      __pyx_v_self->_value = __pyx_t_6;
      __pyx_t_6 = 0;
    }
    __pyx_L34:;

    /* "_cdecimalfp.pyx":158
 *                 self._precision = precision
 *                 self._value = lValue * base10pow(precision)
 *             return             # <<<<<<<<<<<<<<
 * 
 *         # Decimal (from standard library)
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":161
 * 
 *         # Decimal (from standard library)
 *         if isinstance(value, _StdLibDecimal):             # <<<<<<<<<<<<<<
 *             if value.is_finite():
 *                 sign, digits, exp = value.as_tuple()
 */
  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = PyObject_IsInstance(__pyx_v_value, __pyx_t_6); if (unlikely(__pyx_t_5 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_2 = (__pyx_t_5 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":162
 *         # Decimal (from standard library)
 *         if isinstance(value, _StdLibDecimal):
 *             if value.is_finite():             # <<<<<<<<<<<<<<
 *                 sign, digits, exp = value.as_tuple()
 *                 coeff = (-1) ** sign * reduce(lambda x, y: x * 10 + y, digits)
 */
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_is_finite); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_11 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_11)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_11);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (__pyx_t_11) {
      __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_11); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    } else {
      __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":163
 *         if isinstance(value, _StdLibDecimal):
 *             if value.is_finite():
 *                 sign, digits, exp = value.as_tuple()             # <<<<<<<<<<<<<<
 *                 coeff = (-1) ** sign * reduce(lambda x, y: x * 10 + y, digits)
 *                 prec = -1 if precision is None else precision
 */
      __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_as_tuple); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_11 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
        __pyx_t_11 = PyMethod_GET_SELF(__pyx_t_3);
        if (likely(__pyx_t_11)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
          __Pyx_INCREF(__pyx_t_11);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_3, function);
        }
      }
      if (__pyx_t_11) {
        __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_11); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      } else {
        __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) {
        PyObject* sequence = __pyx_t_6;
        #if CYTHON_COMPILING_IN_CPYTHON
        Py_ssize_t size = Py_SIZE(sequence);
        #else
        Py_ssize_t size = PySequence_Size(sequence);
        #endif
        if (unlikely(size != 3)) {
          if (size > 3) __Pyx_RaiseTooManyValuesError(3);
          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        }
        #if CYTHON_COMPILING_IN_CPYTHON
        if (likely(PyTuple_CheckExact(sequence))) {
          __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
          __pyx_t_11 = PyTuple_GET_ITEM(sequence, 1); 
          __pyx_t_13 = PyTuple_GET_ITEM(sequence, 2); 
        } else {
          __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
          __pyx_t_11 = PyList_GET_ITEM(sequence, 1); 
          __pyx_t_13 = PyList_GET_ITEM(sequence, 2); 
        }
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_11);
        __Pyx_INCREF(__pyx_t_13);
        #else
        __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_3);
        __pyx_t_11 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_13 = PySequence_ITEM(sequence, 2); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_13);
        #endif
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      } else {
        Py_ssize_t index = -1;
        __pyx_t_12 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_12);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_14 = Py_TYPE(__pyx_t_12)->tp_iternext;
        index = 0; __pyx_t_3 = __pyx_t_14(__pyx_t_12); if (unlikely(!__pyx_t_3)) goto __pyx_L37_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_3);
        index = 1; __pyx_t_11 = __pyx_t_14(__pyx_t_12); if (unlikely(!__pyx_t_11)) goto __pyx_L37_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_11);
        index = 2; __pyx_t_13 = __pyx_t_14(__pyx_t_12); if (unlikely(!__pyx_t_13)) goto __pyx_L37_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_13);
        if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_12), 3) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_t_14 = NULL;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        goto __pyx_L38_unpacking_done;
        __pyx_L37_unpacking_failed:;
        __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        __pyx_t_14 = NULL;
        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_L38_unpacking_done:;
      }
      __pyx_v_sign = __pyx_t_3;
      __pyx_t_3 = 0;
      __pyx_v_digits = __pyx_t_11;
      __pyx_t_11 = 0;
      __pyx_v_exp = __pyx_t_13;
      __pyx_t_13 = 0;

      /* "_cdecimalfp.pyx":164
 *             if value.is_finite():
 *                 sign, digits, exp = value.as_tuple()
 *                 coeff = (-1) ** sign * reduce(lambda x, y: x * 10 + y, digits)             # <<<<<<<<<<<<<<
 *                 prec = -1 if precision is None else precision
 *                 _dec_from_coeff_exp(self, coeff, exp, prec)
 */
      __pyx_t_6 = PyNumber_Power(__pyx_int_neg_1, __pyx_v_sign, Py_None); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_11 = __Pyx_GetModuleGlobalName(__pyx_n_s_reduce); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_3 = __Pyx_CyFunction_NewEx(&__pyx_mdef_11_cdecimalfp_7Decimal_9__cinit___lambda1, 0, __pyx_n_s_cinit___locals_lambda, NULL, __pyx_n_s_cdecimalfp, __pyx_d, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_12 = NULL;
      __pyx_t_15 = 0;
      if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_11))) {
        __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_11);
        if (likely(__pyx_t_12)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
          __Pyx_INCREF(__pyx_t_12);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_11, function);
          __pyx_t_15 = 1;
        }
      }
      __pyx_t_16 = PyTuple_New(2+__pyx_t_15); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_16);
      if (__pyx_t_12) {
        PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_12); __Pyx_GIVEREF(__pyx_t_12); __pyx_t_12 = NULL;
      }
      PyTuple_SET_ITEM(__pyx_t_16, 0+__pyx_t_15, __pyx_t_3);
      __Pyx_GIVEREF(__pyx_t_3);
      __Pyx_INCREF(__pyx_v_digits);
      PyTuple_SET_ITEM(__pyx_t_16, 1+__pyx_t_15, __pyx_v_digits);
      __Pyx_GIVEREF(__pyx_v_digits);
      __pyx_t_3 = 0;
      __pyx_t_13 = __Pyx_PyObject_Call(__pyx_t_11, __pyx_t_16, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_13);
      __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __pyx_t_11 = PyNumber_Multiply(__pyx_t_6, __pyx_t_13); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_11);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      __pyx_v_coeff = __pyx_t_11;
      __pyx_t_11 = 0;

      /* "_cdecimalfp.pyx":165
 *                 sign, digits, exp = value.as_tuple()
 *                 coeff = (-1) ** sign * reduce(lambda x, y: x * 10 + y, digits)
 *                 prec = -1 if precision is None else precision             # <<<<<<<<<<<<<<
 *                 _dec_from_coeff_exp(self, coeff, exp, prec)
 *                 return
 */
      __pyx_t_2 = (__pyx_v_precision == Py_None);
      if ((__pyx_t_2 != 0)) {
        __pyx_t_4 = -1;
      } else {
        __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_v_precision); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_t_4 = __pyx_t_7;
      }
      __pyx_v_prec = __pyx_t_4;

      /* "_cdecimalfp.pyx":166
 *                 coeff = (-1) ** sign * reduce(lambda x, y: x * 10 + y, digits)
 *                 prec = -1 if precision is None else precision
 *                 _dec_from_coeff_exp(self, coeff, exp, prec)             # <<<<<<<<<<<<<<
 *                 return
 *             else:
 */
      __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_v_exp); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_f_11_cdecimalfp__dec_from_coeff_exp(__pyx_v_self, __pyx_v_coeff, __pyx_t_4, __pyx_v_prec); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

      /* "_cdecimalfp.pyx":167
 *                 prec = -1 if precision is None else precision
 *                 _dec_from_coeff_exp(self, coeff, exp, prec)
 *                 return             # <<<<<<<<<<<<<<
 *             else:
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))
 */
      __pyx_r = 0;
      goto __pyx_L0;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":169
 *                 return
 *             else:
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))             # <<<<<<<<<<<<<<
 * 
 *         # Rational
 */
      __pyx_t_11 = PyObject_Repr(__pyx_v_value); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_11);
      __pyx_t_13 = __Pyx_PyString_Format(__pyx_kp_s_Can_t_convert_s_to_Decimal, __pyx_t_11); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_13);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __pyx_t_11 = PyTuple_New(1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_11);
      PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_13);
      __Pyx_GIVEREF(__pyx_t_13);
      __pyx_t_13 = 0;
      __pyx_t_13 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_11, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_13);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      __Pyx_Raise(__pyx_t_13, 0, 0, 0);
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
  }

  /* "_cdecimalfp.pyx":172
 * 
 *         # Rational
 *         if isinstance(value, numbers.Rational):             # <<<<<<<<<<<<<<
 *             prec = -1 if precision is None else precision
 *             num, den = value.numerator, value.denominator
 */
  __pyx_t_13 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_13, __pyx_n_s_Rational); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_value, __pyx_t_11); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  __pyx_t_5 = (__pyx_t_2 != 0);
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":173
 *         # Rational
 *         if isinstance(value, numbers.Rational):
 *             prec = -1 if precision is None else precision             # <<<<<<<<<<<<<<
 *             num, den = value.numerator, value.denominator
 *             try:
 */
    __pyx_t_5 = (__pyx_v_precision == Py_None);
    if ((__pyx_t_5 != 0)) {
      __pyx_t_4 = -1;
    } else {
      __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_v_precision); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_4 = __pyx_t_7;
    }
    __pyx_v_prec = __pyx_t_4;

    /* "_cdecimalfp.pyx":174
 *         if isinstance(value, numbers.Rational):
 *             prec = -1 if precision is None else precision
 *             num, den = value.numerator, value.denominator             # <<<<<<<<<<<<<<
 *             try:
 *                 _dec_from_rational(self, num, den, prec)
 */
    __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_numerator); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_11);
    __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_denominator); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 174; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_13);
    __pyx_v_num = __pyx_t_11;
    __pyx_t_11 = 0;
    __pyx_v_den = __pyx_t_13;
    __pyx_t_13 = 0;

    /* "_cdecimalfp.pyx":175
 *             prec = -1 if precision is None else precision
 *             num, den = value.numerator, value.denominator
 *             try:             # <<<<<<<<<<<<<<
 *                 _dec_from_rational(self, num, den, prec)
 *             except ValueError:
 */
    {
      __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);
      __Pyx_XGOTREF(__pyx_t_8);
      __Pyx_XGOTREF(__pyx_t_9);
      __Pyx_XGOTREF(__pyx_t_10);
      /*try:*/ {

        /* "_cdecimalfp.pyx":176
 *             num, den = value.numerator, value.denominator
 *             try:
 *                 _dec_from_rational(self, num, den, prec)             # <<<<<<<<<<<<<<
 *             except ValueError:
 *                     raise ValueError("Can't convert %s exactly to Decimal."
 */
        __pyx_f_11_cdecimalfp__dec_from_rational(__pyx_v_self, __pyx_v_num, __pyx_v_den, __pyx_v_prec); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 176; __pyx_clineno = __LINE__; goto __pyx_L40_error;}
      }
      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
      goto __pyx_L47_try_end;
      __pyx_L40_error:;
      __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
      __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;

      /* "_cdecimalfp.pyx":177
 *             try:
 *                 _dec_from_rational(self, num, den, prec)
 *             except ValueError:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Can't convert %s exactly to Decimal."
 *                                      % repr(value))
 */
      __pyx_t_4 = PyErr_ExceptionMatches(__pyx_builtin_ValueError);
      if (__pyx_t_4) {
        __Pyx_AddTraceback("_cdecimalfp.Decimal.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
        if (__Pyx_GetException(&__pyx_t_13, &__pyx_t_11, &__pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 177; __pyx_clineno = __LINE__; goto __pyx_L42_except_error;}
        __Pyx_GOTREF(__pyx_t_13);
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_GOTREF(__pyx_t_6);

        /* "_cdecimalfp.pyx":179
 *             except ValueError:
 *                     raise ValueError("Can't convert %s exactly to Decimal."
 *                                      % repr(value))             # <<<<<<<<<<<<<<
 *             return
 * 
 */
        __pyx_t_16 = PyObject_Repr(__pyx_v_value); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L42_except_error;}
        __Pyx_GOTREF(__pyx_t_16);
        __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_Can_t_convert_s_exactly_to_Decim, __pyx_t_16); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L42_except_error;}
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;

        /* "_cdecimalfp.pyx":178
 *                 _dec_from_rational(self, num, den, prec)
 *             except ValueError:
 *                     raise ValueError("Can't convert %s exactly to Decimal."             # <<<<<<<<<<<<<<
 *                                      % repr(value))
 *             return
 */
        __pyx_t_16 = PyTuple_New(1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L42_except_error;}
        __Pyx_GOTREF(__pyx_t_16);
        PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_3);
        __Pyx_GIVEREF(__pyx_t_3);
        __pyx_t_3 = 0;
        __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_16, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L42_except_error;}
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
        __Pyx_Raise(__pyx_t_3, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L42_except_error;}
      }
      goto __pyx_L42_except_error;
      __pyx_L42_except_error:;
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_XGIVEREF(__pyx_t_10);
      __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10);
      goto __pyx_L1_error;
      __pyx_L47_try_end:;
    }

    /* "_cdecimalfp.pyx":180
 *                     raise ValueError("Can't convert %s exactly to Decimal."
 *                                      % repr(value))
 *             return             # <<<<<<<<<<<<<<
 * 
 *         # Float
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":183
 * 
 *         # Float
 *         if isinstance(value, float):             # <<<<<<<<<<<<<<
 *             try:
 *                 num, den = value.as_integer_ratio()
 */
  __pyx_t_5 = PyFloat_Check(__pyx_v_value); 
  __pyx_t_2 = (__pyx_t_5 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":184
 *         # Float
 *         if isinstance(value, float):
 *             try:             # <<<<<<<<<<<<<<
 *                 num, den = value.as_integer_ratio()
 *             except (ValueError, OverflowError):
 */
    {
      __Pyx_ExceptionSave(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8);
      __Pyx_XGOTREF(__pyx_t_10);
      __Pyx_XGOTREF(__pyx_t_9);
      __Pyx_XGOTREF(__pyx_t_8);
      /*try:*/ {

        /* "_cdecimalfp.pyx":185
 *         if isinstance(value, float):
 *             try:
 *                 num, den = value.as_integer_ratio()             # <<<<<<<<<<<<<<
 *             except (ValueError, OverflowError):
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))
 */
        __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_v_value, __pyx_n_s_as_integer_ratio); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L51_error;}
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_13 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_11))) {
          __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_11);
          if (likely(__pyx_t_13)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
            __Pyx_INCREF(__pyx_t_13);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_11, function);
          }
        }
        if (__pyx_t_13) {
          __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_t_13); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L51_error;}
          __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        } else {
          __pyx_t_6 = __Pyx_PyObject_CallNoArg(__pyx_t_11); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L51_error;}
        }
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) {
          PyObject* sequence = __pyx_t_6;
          #if CYTHON_COMPILING_IN_CPYTHON
          Py_ssize_t size = Py_SIZE(sequence);
          #else
          Py_ssize_t size = PySequence_Size(sequence);
          #endif
          if (unlikely(size != 2)) {
            if (size > 2) __Pyx_RaiseTooManyValuesError(2);
            else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
            {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L51_error;}
          }
          #if CYTHON_COMPILING_IN_CPYTHON
          if (likely(PyTuple_CheckExact(sequence))) {
            __pyx_t_11 = PyTuple_GET_ITEM(sequence, 0); 
            __pyx_t_13 = PyTuple_GET_ITEM(sequence, 1); 
          } else {
            __pyx_t_11 = PyList_GET_ITEM(sequence, 0); 
            __pyx_t_13 = PyList_GET_ITEM(sequence, 1); 
          }
          __Pyx_INCREF(__pyx_t_11);
          __Pyx_INCREF(__pyx_t_13);
          #else
          __pyx_t_11 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L51_error;}
          __Pyx_GOTREF(__pyx_t_11);
          __pyx_t_13 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L51_error;}
          __Pyx_GOTREF(__pyx_t_13);
          #endif
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        } else {
          Py_ssize_t index = -1;
          __pyx_t_3 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L51_error;}
          __Pyx_GOTREF(__pyx_t_3);
          __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
          __pyx_t_14 = Py_TYPE(__pyx_t_3)->tp_iternext;
          index = 0; __pyx_t_11 = __pyx_t_14(__pyx_t_3); if (unlikely(!__pyx_t_11)) goto __pyx_L59_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_11);
          index = 1; __pyx_t_13 = __pyx_t_14(__pyx_t_3); if (unlikely(!__pyx_t_13)) goto __pyx_L59_unpacking_failed;
          __Pyx_GOTREF(__pyx_t_13);
          if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_3), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L51_error;}
          __pyx_t_14 = NULL;
          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
          goto __pyx_L60_unpacking_done;
          __pyx_L59_unpacking_failed:;
          __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
          __pyx_t_14 = NULL;
          if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 185; __pyx_clineno = __LINE__; goto __pyx_L51_error;}
          __pyx_L60_unpacking_done:;
        }
        __pyx_v_num = __pyx_t_11;
        __pyx_t_11 = 0;
        __pyx_v_den = __pyx_t_13;
        __pyx_t_13 = 0;
      }
      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
      goto __pyx_L58_try_end;
      __pyx_L51_error:;
      __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
      __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
      __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;

      /* "_cdecimalfp.pyx":186
 *             try:
 *                 num, den = value.as_integer_ratio()
 *             except (ValueError, OverflowError):             # <<<<<<<<<<<<<<
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))
 *             prec = -1 if precision is None else precision
 */
      __pyx_t_4 = PyErr_ExceptionMatches(__pyx_builtin_ValueError) || PyErr_ExceptionMatches(__pyx_builtin_OverflowError);
      if (__pyx_t_4) {
        __Pyx_AddTraceback("_cdecimalfp.Decimal.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
        if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_13, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L53_except_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_GOTREF(__pyx_t_13);
        __Pyx_GOTREF(__pyx_t_11);

        /* "_cdecimalfp.pyx":187
 *                 num, den = value.as_integer_ratio()
 *             except (ValueError, OverflowError):
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))             # <<<<<<<<<<<<<<
 *             prec = -1 if precision is None else precision
 *             try:
 */
        __pyx_t_3 = PyObject_Repr(__pyx_v_value); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L53_except_error;}
        __Pyx_GOTREF(__pyx_t_3);
        __pyx_t_16 = __Pyx_PyString_Format(__pyx_kp_s_Can_t_convert_s_to_Decimal, __pyx_t_3); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L53_except_error;}
        __Pyx_GOTREF(__pyx_t_16);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L53_except_error;}
        __Pyx_GOTREF(__pyx_t_3);
        PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_16);
        __Pyx_GIVEREF(__pyx_t_16);
        __pyx_t_16 = 0;
        __pyx_t_16 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_3, NULL); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L53_except_error;}
        __Pyx_GOTREF(__pyx_t_16);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        __Pyx_Raise(__pyx_t_16, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 187; __pyx_clineno = __LINE__; goto __pyx_L53_except_error;}
      }
      goto __pyx_L53_except_error;
      __pyx_L53_except_error:;
      __Pyx_XGIVEREF(__pyx_t_10);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_9, __pyx_t_8);
      goto __pyx_L1_error;
      __pyx_L58_try_end:;
    }

    /* "_cdecimalfp.pyx":188
 *             except (ValueError, OverflowError):
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))
 *             prec = -1 if precision is None else precision             # <<<<<<<<<<<<<<
 *             try:
 *                 _dec_from_rational(self, num, den, prec)
 */
    __pyx_t_2 = (__pyx_v_precision == Py_None);
    if ((__pyx_t_2 != 0)) {
      __pyx_t_4 = -1;
    } else {
      __pyx_t_7 = __Pyx_PyInt_As_int(__pyx_v_precision); if (unlikely((__pyx_t_7 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_4 = __pyx_t_7;
    }
    __pyx_v_prec = __pyx_t_4;

    /* "_cdecimalfp.pyx":189
 *                 raise ValueError("Can't convert %s to Decimal." % repr(value))
 *             prec = -1 if precision is None else precision
 *             try:             # <<<<<<<<<<<<<<
 *                 _dec_from_rational(self, num, den, prec)
 *             except ValueError:
 */
    {
      __Pyx_ExceptionSave(&__pyx_t_8, &__pyx_t_9, &__pyx_t_10);
      __Pyx_XGOTREF(__pyx_t_8);
      __Pyx_XGOTREF(__pyx_t_9);
      __Pyx_XGOTREF(__pyx_t_10);
      /*try:*/ {

        /* "_cdecimalfp.pyx":190
 *             prec = -1 if precision is None else precision
 *             try:
 *                 _dec_from_rational(self, num, den, prec)             # <<<<<<<<<<<<<<
 *             except ValueError:
 *                     raise ValueError("Can't convert %s exactly to Decimal."
 */
        __pyx_f_11_cdecimalfp__dec_from_rational(__pyx_v_self, __pyx_v_num, __pyx_v_den, __pyx_v_prec); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 190; __pyx_clineno = __LINE__; goto __pyx_L63_error;}
      }
      __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
      __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
      goto __pyx_L70_try_end;
      __pyx_L63_error:;
      __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
      __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
      __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
      __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;

      /* "_cdecimalfp.pyx":191
 *             try:
 *                 _dec_from_rational(self, num, den, prec)
 *             except ValueError:             # <<<<<<<<<<<<<<
 *                     raise ValueError("Can't convert %s exactly to Decimal."
 *                                      % repr(value))
 */
      __pyx_t_4 = PyErr_ExceptionMatches(__pyx_builtin_ValueError);
      if (__pyx_t_4) {
        __Pyx_AddTraceback("_cdecimalfp.Decimal.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
        if (__Pyx_GetException(&__pyx_t_11, &__pyx_t_13, &__pyx_t_6) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 191; __pyx_clineno = __LINE__; goto __pyx_L65_except_error;}
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_GOTREF(__pyx_t_13);
        __Pyx_GOTREF(__pyx_t_6);

        /* "_cdecimalfp.pyx":193
 *             except ValueError:
 *                     raise ValueError("Can't convert %s exactly to Decimal."
 *                                      % repr(value))             # <<<<<<<<<<<<<<
 *             return
 * 
 */
        __pyx_t_16 = PyObject_Repr(__pyx_v_value); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L65_except_error;}
        __Pyx_GOTREF(__pyx_t_16);
        __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_Can_t_convert_s_exactly_to_Decim, __pyx_t_16); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 193; __pyx_clineno = __LINE__; goto __pyx_L65_except_error;}
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;

        /* "_cdecimalfp.pyx":192
 *                 _dec_from_rational(self, num, den, prec)
 *             except ValueError:
 *                     raise ValueError("Can't convert %s exactly to Decimal."             # <<<<<<<<<<<<<<
 *                                      % repr(value))
 *             return
 */
        __pyx_t_16 = PyTuple_New(1); if (unlikely(!__pyx_t_16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L65_except_error;}
        __Pyx_GOTREF(__pyx_t_16);
        PyTuple_SET_ITEM(__pyx_t_16, 0, __pyx_t_3);
        __Pyx_GIVEREF(__pyx_t_3);
        __pyx_t_3 = 0;
        __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_16, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L65_except_error;}
        __Pyx_GOTREF(__pyx_t_3);
        __Pyx_DECREF(__pyx_t_16); __pyx_t_16 = 0;
        __Pyx_Raise(__pyx_t_3, 0, 0, 0);
        __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 192; __pyx_clineno = __LINE__; goto __pyx_L65_except_error;}
      }
      goto __pyx_L65_except_error;
      __pyx_L65_except_error:;
      __Pyx_XGIVEREF(__pyx_t_8);
      __Pyx_XGIVEREF(__pyx_t_9);
      __Pyx_XGIVEREF(__pyx_t_10);
      __Pyx_ExceptionReset(__pyx_t_8, __pyx_t_9, __pyx_t_10);
      goto __pyx_L1_error;
      __pyx_L70_try_end:;
    }

    /* "_cdecimalfp.pyx":194
 *                     raise ValueError("Can't convert %s exactly to Decimal."
 *                                      % repr(value))
 *             return             # <<<<<<<<<<<<<<
 * 
 *         # Others
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":198
 *         # Others
 *         # If there's a float or int equivalent to value, use it
 *         ev = None             # <<<<<<<<<<<<<<
 *         try:
 *             ev = PyNumber_Float(value)
 */
  __Pyx_INCREF(Py_None);
  __pyx_v_ev = Py_None;

  /* "_cdecimalfp.pyx":199
 *         # If there's a float or int equivalent to value, use it
 *         ev = None
 *         try:             # <<<<<<<<<<<<<<
 *             ev = PyNumber_Float(value)
 *         except:
 */
  {
    __Pyx_ExceptionSave(&__pyx_t_10, &__pyx_t_9, &__pyx_t_8);
    __Pyx_XGOTREF(__pyx_t_10);
    __Pyx_XGOTREF(__pyx_t_9);
    __Pyx_XGOTREF(__pyx_t_8);
    /*try:*/ {

      /* "_cdecimalfp.pyx":200
 *         ev = None
 *         try:
 *             ev = PyNumber_Float(value)             # <<<<<<<<<<<<<<
 *         except:
 *             try:
 */
      __pyx_t_6 = PyNumber_Float(__pyx_v_value); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 200; __pyx_clineno = __LINE__; goto __pyx_L73_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF_SET(__pyx_v_ev, __pyx_t_6);
      __pyx_t_6 = 0;
    }
    __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0;
    goto __pyx_L80_try_end;
    __pyx_L73_error:;
    __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
    __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0;
    __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0;
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;

    /* "_cdecimalfp.pyx":201
 *         try:
 *             ev = PyNumber_Float(value)
 *         except:             # <<<<<<<<<<<<<<
 *             try:
 *                 ev = PyNumber_Int(value)
 */
    /*except:*/ {
      __Pyx_AddTraceback("_cdecimalfp.Decimal.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_13, &__pyx_t_11) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L75_except_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_GOTREF(__pyx_t_13);
      __Pyx_GOTREF(__pyx_t_11);

      /* "_cdecimalfp.pyx":202
 *             ev = PyNumber_Float(value)
 *         except:
 *             try:             # <<<<<<<<<<<<<<
 *                 ev = PyNumber_Int(value)
 *             except:
 */
      {
        __Pyx_ExceptionSave(&__pyx_t_17, &__pyx_t_18, &__pyx_t_19);
        __Pyx_XGOTREF(__pyx_t_17);
        __Pyx_XGOTREF(__pyx_t_18);
        __Pyx_XGOTREF(__pyx_t_19);
        /*try:*/ {

          /* "_cdecimalfp.pyx":203
 *         except:
 *             try:
 *                 ev = PyNumber_Int(value)             # <<<<<<<<<<<<<<
 *             except:
 *                 pass
 */
          __pyx_t_3 = PyNumber_Int(__pyx_v_value); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 203; __pyx_clineno = __LINE__; goto __pyx_L83_error;}
          __Pyx_GOTREF(__pyx_t_3);
          __Pyx_DECREF_SET(__pyx_v_ev, __pyx_t_3);
          __pyx_t_3 = 0;
        }
        __Pyx_XDECREF(__pyx_t_17); __pyx_t_17 = 0;
        __Pyx_XDECREF(__pyx_t_18); __pyx_t_18 = 0;
        __Pyx_XDECREF(__pyx_t_19); __pyx_t_19 = 0;
        goto __pyx_L90_try_end;
        __pyx_L83_error:;
        __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0;
        __Pyx_XDECREF(__pyx_t_16); __pyx_t_16 = 0;
        __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;

        /* "_cdecimalfp.pyx":204
 *             try:
 *                 ev = PyNumber_Int(value)
 *             except:             # <<<<<<<<<<<<<<
 *                 pass
 *         if ev == value:     # do we really have the same value?
 */
        /*except:*/ {
          PyErr_Restore(0,0,0);
          goto __pyx_L84_exception_handled;
        }
        __pyx_L84_exception_handled:;
        __Pyx_XGIVEREF(__pyx_t_17);
        __Pyx_XGIVEREF(__pyx_t_18);
        __Pyx_XGIVEREF(__pyx_t_19);
        __Pyx_ExceptionReset(__pyx_t_17, __pyx_t_18, __pyx_t_19);
        __pyx_L90_try_end:;
      }
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      goto __pyx_L74_exception_handled;
    }
    __pyx_L75_except_error:;
    __Pyx_XGIVEREF(__pyx_t_10);
    __Pyx_XGIVEREF(__pyx_t_9);
    __Pyx_XGIVEREF(__pyx_t_8);
    __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_9, __pyx_t_8);
    goto __pyx_L1_error;
    __pyx_L74_exception_handled:;
    __Pyx_XGIVEREF(__pyx_t_10);
    __Pyx_XGIVEREF(__pyx_t_9);
    __Pyx_XGIVEREF(__pyx_t_8);
    __Pyx_ExceptionReset(__pyx_t_10, __pyx_t_9, __pyx_t_8);
    __pyx_L80_try_end:;
  }

  /* "_cdecimalfp.pyx":206
 *             except:
 *                 pass
 *         if ev == value:     # do we really have the same value?             # <<<<<<<<<<<<<<
 *             dec = Decimal(ev, precision)
 *             self._value = dec._value
 */
  __pyx_t_11 = PyObject_RichCompare(__pyx_v_ev, __pyx_v_value, Py_EQ); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":207
 *                 pass
 *         if ev == value:     # do we really have the same value?
 *             dec = Decimal(ev, precision)             # <<<<<<<<<<<<<<
 *             self._value = dec._value
 *             self._precision = dec._precision
 */
    __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_INCREF(__pyx_v_ev);
    PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_ev);
    __Pyx_GIVEREF(__pyx_v_ev);
    __Pyx_INCREF(__pyx_v_precision);
    PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_v_precision);
    __Pyx_GIVEREF(__pyx_v_precision);
    __pyx_t_13 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_11, NULL); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 207; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_13);
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_v_dec = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_13);
    __pyx_t_13 = 0;

    /* "_cdecimalfp.pyx":208
 *         if ev == value:     # do we really have the same value?
 *             dec = Decimal(ev, precision)
 *             self._value = dec._value             # <<<<<<<<<<<<<<
 *             self._precision = dec._precision
 *             return
 */
    __pyx_t_13 = __pyx_v_dec->_value;
    __Pyx_INCREF(__pyx_t_13);
    __Pyx_GIVEREF(__pyx_t_13);
    __Pyx_GOTREF(__pyx_v_self->_value);
    __Pyx_DECREF(__pyx_v_self->_value);
    __pyx_v_self->_value = __pyx_t_13;
    __pyx_t_13 = 0;

    /* "_cdecimalfp.pyx":209
 *             dec = Decimal(ev, precision)
 *             self._value = dec._value
 *             self._precision = dec._precision             # <<<<<<<<<<<<<<
 *             return
 * 
 */
    __pyx_t_4 = __pyx_v_dec->_precision;
    __pyx_v_self->_precision = __pyx_t_4;

    /* "_cdecimalfp.pyx":210
 *             self._value = dec._value
 *             self._precision = dec._precision
 *             return             # <<<<<<<<<<<<<<
 * 
 *         # unable to create Decimal
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":213
 * 
 *         # unable to create Decimal
 *         raise TypeError("Can't convert %s to Decimal." % repr(value))             # <<<<<<<<<<<<<<
 * 
 *     # to be compatible to fractions.Fraction
 */
  __pyx_t_13 = PyObject_Repr(__pyx_v_value); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_13);
  __pyx_t_11 = __Pyx_PyString_Format(__pyx_kp_s_Can_t_convert_s_to_Decimal, __pyx_t_13); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __pyx_t_13 = PyTuple_New(1); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_13);
  PyTuple_SET_ITEM(__pyx_t_13, 0, __pyx_t_11);
  __Pyx_GIVEREF(__pyx_t_11);
  __pyx_t_11 = 0;
  __pyx_t_11 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_t_13, NULL); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_11);
  __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
  __Pyx_Raise(__pyx_t_11, 0, 0, 0);
  __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
  {__pyx_filename = __pyx_f[0]; __pyx_lineno = 213; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":107
 *     cdef int _precision
 * 
 *     def __cinit__(self, object value=None, object precision=None):             # <<<<<<<<<<<<<<
 * 
 *         cdef object num, den
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_XDECREF(__pyx_t_16);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_num);
  __Pyx_XDECREF(__pyx_v_den);
  __Pyx_XDECREF((PyObject *)__pyx_v_dec);
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XDECREF(__pyx_v_lValue);
  __Pyx_XDECREF(__pyx_v_sign);
  __Pyx_XDECREF(__pyx_v_digits);
  __Pyx_XDECREF(__pyx_v_exp);
  __Pyx_XDECREF(__pyx_v_coeff);
  __Pyx_XDECREF(__pyx_v_ev);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":217
 *     # to be compatible to fractions.Fraction
 *     @classmethod
 *     def from_float(cls, f):             # <<<<<<<<<<<<<<
 *         """Convert a finite float (or int) to a :class:`Decimal`.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_3from_float(PyObject *__pyx_v_cls, PyObject *__pyx_v_f); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_2from_float[] = "Convert a finite float (or int) to a :class:`Decimal`.\n\n        Args:\n            f (float or int): number to be converted to a `Decimal`\n\n        Returns:\n            :class:`Decimal` instance derived from `f`\n\n        Raises:\n            TypeError: `f` is neither a `float` nor an `int`.\n            ValueError: `f` can not be converted to a :class:`Decimal` with\n                a precision <= `LIMIT_PREC`.\n\n        Beware that Decimal.from_float(0.3) != Decimal('0.3').\n        ";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_3from_float(PyObject *__pyx_v_cls, PyObject *__pyx_v_f) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("from_float (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_2from_float(((PyObject*)__pyx_v_cls), ((PyObject *)__pyx_v_f));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_2from_float(PyObject *__pyx_v_cls, PyObject *__pyx_v_f) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("from_float", 0);

  /* "_cdecimalfp.pyx":233
 *         Beware that Decimal.from_float(0.3) != Decimal('0.3').
 *         """
 *         if not isinstance(f, (float, numbers.Integral)):             # <<<<<<<<<<<<<<
 *             raise TypeError("%s is not a float." % repr(f))
 *         return cls(f)
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Integral); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 233; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = PyFloat_Check(__pyx_v_f); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  if (!__pyx_t_5) {
  } else {
    __pyx_t_3 = __pyx_t_5;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_5 = PyObject_IsInstance(__pyx_v_f, __pyx_t_2); 
  __pyx_t_4 = (__pyx_t_5 != 0);
  __pyx_t_3 = __pyx_t_4;
  __pyx_L4_bool_binop_done:;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = ((!(__pyx_t_3 != 0)) != 0);
  if (__pyx_t_4) {

    /* "_cdecimalfp.pyx":234
 *         """
 *         if not isinstance(f, (float, numbers.Integral)):
 *             raise TypeError("%s is not a float." % repr(f))             # <<<<<<<<<<<<<<
 *         return cls(f)
 * 
 */
    __pyx_t_2 = PyObject_Repr(__pyx_v_f); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_s_is_not_a_float, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 234; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "_cdecimalfp.pyx":235
 *         if not isinstance(f, (float, numbers.Integral)):
 *             raise TypeError("%s is not a float." % repr(f))
 *         return cls(f)             # <<<<<<<<<<<<<<
 * 
 *     # to be compatible to fractions.Fraction
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_f);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_f);
  __Pyx_GIVEREF(__pyx_v_f);
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_cls), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":217
 *     # to be compatible to fractions.Fraction
 *     @classmethod
 *     def from_float(cls, f):             # <<<<<<<<<<<<<<
 *         """Convert a finite float (or int) to a :class:`Decimal`.
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.from_float", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":239
 *     # to be compatible to fractions.Fraction
 *     @classmethod
 *     def from_decimal(cls, d):             # <<<<<<<<<<<<<<
 *         """Convert a finite decimal number to a :class:`Decimal`.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_5from_decimal(PyObject *__pyx_v_cls, PyObject *__pyx_v_d); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_4from_decimal[] = "Convert a finite decimal number to a :class:`Decimal`.\n\n        Args:\n            d (see below): decimal number to be converted to a\n                :class:`Decimal`\n\n        `d` can be of type :class:`Decimal`, `numbers.Integral` or\n        `decimal.Decimal`.\n\n        Returns:\n            Decimal: :class:`Decimal` instance derived from `d`\n\n        Raises:\n            TypeError: `d` is not an instance of the types listed above.\n            ValueError: `d` can not be converted to a :class:`Decimal`.\n        ";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_5from_decimal(PyObject *__pyx_v_cls, PyObject *__pyx_v_d) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("from_decimal (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_4from_decimal(((PyObject*)__pyx_v_cls), ((PyObject *)__pyx_v_d));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_4from_decimal(PyObject *__pyx_v_cls, PyObject *__pyx_v_d) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("from_decimal", 0);

  /* "_cdecimalfp.pyx":256
 *             ValueError: `d` can not be converted to a :class:`Decimal`.
 *         """
 *         if not isinstance(d, (Decimal, numbers.Integral, _StdLibDecimal)):             # <<<<<<<<<<<<<<
 *             raise TypeError("%s is not a Decimal." % repr(d))
 *         return cls(d)
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Integral); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_TypeCheck(__pyx_v_d, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  if (!__pyx_t_5) {
  } else {
    __pyx_t_3 = __pyx_t_5;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_5 = PyObject_IsInstance(__pyx_v_d, __pyx_t_2); 
  __pyx_t_4 = (__pyx_t_5 != 0);
  if (!__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = PyObject_IsInstance(__pyx_v_d, __pyx_t_1); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_5;
  __pyx_L4_bool_binop_done:;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = ((!(__pyx_t_3 != 0)) != 0);
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":257
 *         """
 *         if not isinstance(d, (Decimal, numbers.Integral, _StdLibDecimal)):
 *             raise TypeError("%s is not a Decimal." % repr(d))             # <<<<<<<<<<<<<<
 *         return cls(d)
 * 
 */
    __pyx_t_2 = PyObject_Repr(__pyx_v_d); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_s_is_not_a_Decimal, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "_cdecimalfp.pyx":258
 *         if not isinstance(d, (Decimal, numbers.Integral, _StdLibDecimal)):
 *             raise TypeError("%s is not a Decimal." % repr(d))
 *         return cls(d)             # <<<<<<<<<<<<<<
 * 
 *     @classmethod
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_d);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_d);
  __Pyx_GIVEREF(__pyx_v_d);
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_cls), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":239
 *     # to be compatible to fractions.Fraction
 *     @classmethod
 *     def from_decimal(cls, d):             # <<<<<<<<<<<<<<
 *         """Convert a finite decimal number to a :class:`Decimal`.
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.from_decimal", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":261
 * 
 *     @classmethod
 *     def from_real(cls, r, exact=True):             # <<<<<<<<<<<<<<
 *         """Convert a Real number to a :class:`Decimal`.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_7from_real(PyObject *__pyx_v_cls, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_6from_real[] = "Convert a Real number to a :class:`Decimal`.\n\n        Args:\n            r (`numbers.Real`): number to be converted to a :class:`Decimal`\n            exact (`bool`): `True` if `r` shall exactly be represented by\n                the resulting :class:`Decimal`\n\n        Returns:\n            Decimal: :class:`Decimal` instance derived from `r`\n\n        Raises:\n            TypeError: `r` is not an instance of `numbers.Real`.\n            ValueError: `exact` is `True` and `r` can not exactly be converted\n                to a :class:`Decimal` with a precision <= `LIMIT_PREC`.\n\n        If `exact` is `False` and `r` can not exactly be represented by a\n        `Decimal` with a precision <= `LIMIT_PREC`, the result is rounded to a\n        precision = `LIMIT_PREC`.\n        ";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_7from_real(PyObject *__pyx_v_cls, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_r = 0;
  PyObject *__pyx_v_exact = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("from_real (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_r,&__pyx_n_s_exact,0};
    PyObject* values[2] = {0,0};
    values[1] = ((PyObject *)Py_True);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_r)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_exact);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "from_real") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_r = values[0];
    __pyx_v_exact = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("from_real", 0, 1, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("_cdecimalfp.Decimal.from_real", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_6from_real(((PyObject*)__pyx_v_cls), __pyx_v_r, __pyx_v_exact);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_6from_real(PyObject *__pyx_v_cls, PyObject *__pyx_v_r, PyObject *__pyx_v_exact) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  int __pyx_t_8;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *__pyx_t_12 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("from_real", 0);

  /* "_cdecimalfp.pyx":281
 *         precision = `LIMIT_PREC`.
 *         """
 *         if not isinstance(r, numbers.Real):             # <<<<<<<<<<<<<<
 *             raise TypeError("%s is not a Real." % repr(r))
 *         try:
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Real); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = PyObject_IsInstance(__pyx_v_r, __pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 281; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = ((!(__pyx_t_3 != 0)) != 0);
  if (__pyx_t_4) {

    /* "_cdecimalfp.pyx":282
 *         """
 *         if not isinstance(r, numbers.Real):
 *             raise TypeError("%s is not a Real." % repr(r))             # <<<<<<<<<<<<<<
 *         try:
 *             return cls(r)
 */
    __pyx_t_2 = PyObject_Repr(__pyx_v_r); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_s_is_not_a_Real, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "_cdecimalfp.pyx":283
 *         if not isinstance(r, numbers.Real):
 *             raise TypeError("%s is not a Real." % repr(r))
 *         try:             # <<<<<<<<<<<<<<
 *             return cls(r)
 *         except ValueError:
 */
  {
    __Pyx_ExceptionSave(&__pyx_t_5, &__pyx_t_6, &__pyx_t_7);
    __Pyx_XGOTREF(__pyx_t_5);
    __Pyx_XGOTREF(__pyx_t_6);
    __Pyx_XGOTREF(__pyx_t_7);
    /*try:*/ {

      /* "_cdecimalfp.pyx":284
 *             raise TypeError("%s is not a Real." % repr(r))
 *         try:
 *             return cls(r)             # <<<<<<<<<<<<<<
 *         except ValueError:
 *             if exact:
 */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L4_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_INCREF(__pyx_v_r);
      PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_r);
      __Pyx_GIVEREF(__pyx_v_r);
      __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_cls), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 284; __pyx_clineno = __LINE__; goto __pyx_L4_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_r = __pyx_t_2;
      __pyx_t_2 = 0;
      goto __pyx_L8_try_return;
    }
    __pyx_L4_error:;
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "_cdecimalfp.pyx":285
 *         try:
 *             return cls(r)
 *         except ValueError:             # <<<<<<<<<<<<<<
 *             if exact:
 *                 raise
 */
    __pyx_t_8 = PyErr_ExceptionMatches(__pyx_builtin_ValueError);
    if (__pyx_t_8) {
      __Pyx_AddTraceback("_cdecimalfp.Decimal.from_real", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_2, &__pyx_t_1, &__pyx_t_9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 285; __pyx_clineno = __LINE__; goto __pyx_L6_except_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_GOTREF(__pyx_t_9);

      /* "_cdecimalfp.pyx":286
 *             return cls(r)
 *         except ValueError:
 *             if exact:             # <<<<<<<<<<<<<<
 *                 raise
 *             else:
 */
      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_exact); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L6_except_error;}
      if (__pyx_t_4) {

        /* "_cdecimalfp.pyx":287
 *         except ValueError:
 *             if exact:
 *                 raise             # <<<<<<<<<<<<<<
 *             else:
 *                 return cls(r, _get_limit_prec())
 */
        __Pyx_GIVEREF(__pyx_t_2);
        __Pyx_GIVEREF(__pyx_t_1);
        __Pyx_XGIVEREF(__pyx_t_9);
        __Pyx_ErrRestore(__pyx_t_2, __pyx_t_1, __pyx_t_9);
        __pyx_t_2 = 0; __pyx_t_1 = 0; __pyx_t_9 = 0; 
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 287; __pyx_clineno = __LINE__; goto __pyx_L6_except_error;}
      }
      /*else*/ {

        /* "_cdecimalfp.pyx":289
 *                 raise
 *             else:
 *                 return cls(r, _get_limit_prec())             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
        __Pyx_XDECREF(__pyx_r);
        __pyx_t_11 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_limit_prec); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L6_except_error;}
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_12 = NULL;
        if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_11))) {
          __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_11);
          if (likely(__pyx_t_12)) {
            PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_11);
            __Pyx_INCREF(__pyx_t_12);
            __Pyx_INCREF(function);
            __Pyx_DECREF_SET(__pyx_t_11, function);
          }
        }
        if (__pyx_t_12) {
          __pyx_t_10 = __Pyx_PyObject_CallOneArg(__pyx_t_11, __pyx_t_12); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L6_except_error;}
          __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
        } else {
          __pyx_t_10 = __Pyx_PyObject_CallNoArg(__pyx_t_11); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L6_except_error;}
        }
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __pyx_t_11 = PyTuple_New(2); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L6_except_error;}
        __Pyx_GOTREF(__pyx_t_11);
        __Pyx_INCREF(__pyx_v_r);
        PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_v_r);
        __Pyx_GIVEREF(__pyx_v_r);
        PyTuple_SET_ITEM(__pyx_t_11, 1, __pyx_t_10);
        __Pyx_GIVEREF(__pyx_t_10);
        __pyx_t_10 = 0;
        __pyx_t_10 = __Pyx_PyObject_Call(((PyObject *)__pyx_v_cls), __pyx_t_11, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 289; __pyx_clineno = __LINE__; goto __pyx_L6_except_error;}
        __Pyx_GOTREF(__pyx_t_10);
        __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
        __pyx_r = __pyx_t_10;
        __pyx_t_10 = 0;
        __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
        __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
        __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
        goto __pyx_L7_except_return;
      }
    }
    goto __pyx_L6_except_error;
    __pyx_L6_except_error:;
    __Pyx_XGIVEREF(__pyx_t_5);
    __Pyx_XGIVEREF(__pyx_t_6);
    __Pyx_XGIVEREF(__pyx_t_7);
    __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
    goto __pyx_L1_error;
    __pyx_L8_try_return:;
    __Pyx_XGIVEREF(__pyx_t_5);
    __Pyx_XGIVEREF(__pyx_t_6);
    __Pyx_XGIVEREF(__pyx_t_7);
    __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
    goto __pyx_L0;
    __pyx_L7_except_return:;
    __Pyx_XGIVEREF(__pyx_t_5);
    __Pyx_XGIVEREF(__pyx_t_6);
    __Pyx_XGIVEREF(__pyx_t_7);
    __Pyx_ExceptionReset(__pyx_t_5, __pyx_t_6, __pyx_t_7);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":261
 * 
 *     @classmethod
 *     def from_real(cls, r, exact=True):             # <<<<<<<<<<<<<<
 *         """Convert a Real number to a :class:`Decimal`.
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.from_real", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":292
 * 
 *     @property
 *     def precision(self):             # <<<<<<<<<<<<<<
 *         """Return precision of `self`."""
 *         return self._precision
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_9precision(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_8precision[] = "Return precision of `self`.";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_9precision(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("precision (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_8precision(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_8precision(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("precision", 0);

  /* "_cdecimalfp.pyx":294
 *     def precision(self):
 *         """Return precision of `self`."""
 *         return self._precision             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_precision); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 294; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":292
 * 
 *     @property
 *     def precision(self):             # <<<<<<<<<<<<<<
 *         """Return precision of `self`."""
 *         return self._precision
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.precision", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":297
 * 
 *     @property
 *     def magnitude(self):             # <<<<<<<<<<<<<<
 *         """Return magnitude of `self` in terms of power to 10, i.e. the
 *         smallest integer exp so that 10 ** exp >= self."""
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_11magnitude(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_10magnitude[] = "Return magnitude of `self` in terms of power to 10, i.e. the\n        smallest integer exp so that 10 ** exp >= self.";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_11magnitude(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("magnitude (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_10magnitude(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_10magnitude(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  Py_ssize_t __pyx_t_3;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("magnitude", 0);

  /* "_cdecimalfp.pyx":300
 *         """Return magnitude of `self` in terms of power to 10, i.e. the
 *         smallest integer exp so that 10 ** exp >= self."""
 *         return len(str(self._value)) - self._precision             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_self->_value);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->_value);
  __Pyx_GIVEREF(__pyx_v_self->_value);
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = PyObject_Length(__pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyInt_FromSsize_t((__pyx_t_3 - __pyx_v_self->_precision)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 300; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":297
 * 
 *     @property
 *     def magnitude(self):             # <<<<<<<<<<<<<<
 *         """Return magnitude of `self` in terms of power to 10, i.e. the
 *         smallest integer exp so that 10 ** exp >= self."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.magnitude", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":303
 * 
 *     @property
 *     def numerator(self):             # <<<<<<<<<<<<<<
 *         """Return the numerator from the pair of integers with the smallest
 *         positive denominator, whose ratio is equal to `self`."""
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_13numerator(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_12numerator[] = "Return the numerator from the pair of integers with the smallest\n        positive denominator, whose ratio is equal to `self`.";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_13numerator(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("numerator (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_12numerator(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_12numerator(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_v_n = NULL;
  CYTHON_UNUSED PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *(*__pyx_t_5)(PyObject *);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("numerator", 0);

  /* "_cdecimalfp.pyx":306
 *         """Return the numerator from the pair of integers with the smallest
 *         positive denominator, whose ratio is equal to `self`."""
 *         n, d = self.as_integer_ratio()             # <<<<<<<<<<<<<<
 *         return n
 * 
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_as_integer_ratio); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_5 = Py_TYPE(__pyx_t_4)->tp_iternext;
    index = 0; __pyx_t_2 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    index = 1; __pyx_t_3 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_3)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_5(__pyx_t_4), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_5 = NULL;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_5 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_n = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_d = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "_cdecimalfp.pyx":307
 *         positive denominator, whose ratio is equal to `self`."""
 *         n, d = self.as_integer_ratio()
 *         return n             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_n);
  __pyx_r = __pyx_v_n;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":303
 * 
 *     @property
 *     def numerator(self):             # <<<<<<<<<<<<<<
 *         """Return the numerator from the pair of integers with the smallest
 *         positive denominator, whose ratio is equal to `self`."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.numerator", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_n);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":310
 * 
 *     @property
 *     def denominator(self):             # <<<<<<<<<<<<<<
 *         """Return the smallest positive denominator from the pairs of
 *         integers, whose ratio is equal to `self`."""
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_15denominator(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_14denominator[] = "Return the smallest positive denominator from the pairs of\n        integers, whose ratio is equal to `self`.";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_15denominator(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("denominator (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_14denominator(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_14denominator(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  CYTHON_UNUSED PyObject *__pyx_v_n = NULL;
  PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *(*__pyx_t_5)(PyObject *);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("denominator", 0);

  /* "_cdecimalfp.pyx":313
 *         """Return the smallest positive denominator from the pairs of
 *         integers, whose ratio is equal to `self`."""
 *         n, d = self.as_integer_ratio()             # <<<<<<<<<<<<<<
 *         return d
 * 
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_as_integer_ratio); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_5 = Py_TYPE(__pyx_t_4)->tp_iternext;
    index = 0; __pyx_t_2 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    index = 1; __pyx_t_3 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_3)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_5(__pyx_t_4), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_5 = NULL;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_5 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_n = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_d = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "_cdecimalfp.pyx":314
 *         integers, whose ratio is equal to `self`."""
 *         n, d = self.as_integer_ratio()
 *         return d             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_v_d);
  __pyx_r = __pyx_v_d;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":310
 * 
 *     @property
 *     def denominator(self):             # <<<<<<<<<<<<<<
 *         """Return the smallest positive denominator from the pairs of
 *         integers, whose ratio is equal to `self`."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.denominator", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_n);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":317
 * 
 *     @property
 *     def real(self):             # <<<<<<<<<<<<<<
 *         """The real of `self`.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_17real(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_16real[] = "The real of `self`.\n\n        Returns `self` (Real numbers are their real component).";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_17real(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("real (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_16real(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_16real(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("real", 0);

  /* "_cdecimalfp.pyx":321
 * 
 *         Returns `self` (Real numbers are their real component)."""
 *         return self             # <<<<<<<<<<<<<<
 * 
 *     @property
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __pyx_r = ((PyObject *)__pyx_v_self);
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":317
 * 
 *     @property
 *     def real(self):             # <<<<<<<<<<<<<<
 *         """The real of `self`.
 * 
 */

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":324
 * 
 *     @property
 *     def imag(self):             # <<<<<<<<<<<<<<
 *         """The imaginary part of `self`.
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_19imag(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_18imag[] = "The imaginary part of `self`.\n\n        Returns 0 (Real numbers have no imaginary component).";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_19imag(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("imag (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_18imag(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_18imag(CYTHON_UNUSED struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("imag", 0);

  /* "_cdecimalfp.pyx":328
 * 
 *         Returns 0 (Real numbers have no imaginary component)."""
 *         return 0             # <<<<<<<<<<<<<<
 * 
 *     def adjusted(self, precision=None, rounding=None):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_int_0);
  __pyx_r = __pyx_int_0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":324
 * 
 *     @property
 *     def imag(self):             # <<<<<<<<<<<<<<
 *         """The imaginary part of `self`.
 * 
 */

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":330
 *         return 0
 * 
 *     def adjusted(self, precision=None, rounding=None):             # <<<<<<<<<<<<<<
 *         """Return copy of `self`, adjusted to the given `precision`, using the
 *         given `rounding` mode.
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_21adjusted(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_20adjusted[] = "Return copy of `self`, adjusted to the given `precision`, using the\n        given `rounding` mode.\n\n        Args:\n            precision (int): number of fractional digits (default: None)\n            rounding(str): rounding mode (default: None)\n\n        Returns:\n            Decimal: :class:`Decimal` instance derived from `self`, adjusted\n                to the given `precision`, using the given `rounding` mode\n\n        If no `precision` is given, the result is adjusted to the minimum\n        precision preserving x == x.adjusted().\n\n        If no `rounding` mode is given, the default mode from the current\n        context (from module `decimal`) is used.\n\n        If the given `precision` is less than the precision of `self`, the\n        result is rounded and thus information may be lost.\n        ";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_21adjusted(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_precision = 0;
  PyObject *__pyx_v_rounding = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("adjusted (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_precision,&__pyx_n_s_rounding,0};
    PyObject* values[2] = {0,0};
    values[0] = ((PyObject *)Py_None);
    values[1] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision);
          if (value) { values[0] = value; kw_args--; }
        }
        case  1:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_rounding);
          if (value) { values[1] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "adjusted") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_precision = values[0];
    __pyx_v_rounding = values[1];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("adjusted", 0, 0, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("_cdecimalfp.Decimal.adjusted", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_20adjusted(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self), __pyx_v_precision, __pyx_v_rounding);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_20adjusted(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_precision, PyObject *__pyx_v_rounding) {
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_result = 0;
  PyObject *__pyx_v_v = NULL;
  PyObject *__pyx_v_p = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_t_6;
  struct __pyx_opt_args_11_cdecimalfp__adjust __pyx_t_7;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("adjusted", 0);

  /* "_cdecimalfp.pyx":352
 *         """
 *         cdef Decimal result
 *         if precision is None:             # <<<<<<<<<<<<<<
 *             v, p = _reduce(self)
 *             result = Decimal()
 */
  __pyx_t_1 = (__pyx_v_precision == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":353
 *         cdef Decimal result
 *         if precision is None:
 *             v, p = _reduce(self)             # <<<<<<<<<<<<<<
 *             result = Decimal()
 *             result._value = v
 */
    __pyx_t_3 = __pyx_f_11_cdecimalfp__reduce(__pyx_v_self); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    if (likely(__pyx_t_3 != Py_None)) {
      PyObject* sequence = __pyx_t_3;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
      __Pyx_INCREF(__pyx_t_4);
      __Pyx_INCREF(__pyx_t_5);
      #else
      __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      #endif
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    } else {
      __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 353; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_v_v = __pyx_t_4;
    __pyx_t_4 = 0;
    __pyx_v_p = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":354
 *         if precision is None:
 *             v, p = _reduce(self)
 *             result = Decimal()             # <<<<<<<<<<<<<<
 *             result._value = v
 *             result._precision = p
 */
    __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_3);
    __pyx_t_3 = 0;

    /* "_cdecimalfp.pyx":355
 *             v, p = _reduce(self)
 *             result = Decimal()
 *             result._value = v             # <<<<<<<<<<<<<<
 *             result._precision = p
 *         else:
 */
    __Pyx_INCREF(__pyx_v_v);
    __Pyx_GIVEREF(__pyx_v_v);
    __Pyx_GOTREF(__pyx_v_result->_value);
    __Pyx_DECREF(__pyx_v_result->_value);
    __pyx_v_result->_value = __pyx_v_v;

    /* "_cdecimalfp.pyx":356
 *             result = Decimal()
 *             result._value = v
 *             result._precision = p             # <<<<<<<<<<<<<<
 *         else:
 *             result = Decimal(self)
 */
    __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_v_p); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 356; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_result->_precision = __pyx_t_6;
    goto __pyx_L3;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":358
 *             result._precision = p
 *         else:
 *             result = Decimal(self)             # <<<<<<<<<<<<<<
 *             _adjust(result, precision, rounding)
 *         return result
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(((PyObject *)__pyx_v_self));
    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_self));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
    __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 358; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_5);
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":359
 *         else:
 *             result = Decimal(self)
 *             _adjust(result, precision, rounding)             # <<<<<<<<<<<<<<
 *         return result
 * 
 */
    __pyx_t_6 = __Pyx_PyInt_As_int(__pyx_v_precision); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7.__pyx_n = 1;
    __pyx_t_7.rounding = __pyx_v_rounding;
    __pyx_f_11_cdecimalfp__adjust(__pyx_v_result, __pyx_t_6, &__pyx_t_7); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 359; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":360
 *             result = Decimal(self)
 *             _adjust(result, precision, rounding)
 *         return result             # <<<<<<<<<<<<<<
 * 
 *     def as_tuple(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_result));
  __pyx_r = ((PyObject *)__pyx_v_result);
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":330
 *         return 0
 * 
 *     def adjusted(self, precision=None, rounding=None):             # <<<<<<<<<<<<<<
 *         """Return copy of `self`, adjusted to the given `precision`, using the
 *         given `rounding` mode.
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.adjusted", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_result);
  __Pyx_XDECREF(__pyx_v_v);
  __Pyx_XDECREF(__pyx_v_p);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":362
 *         return result
 * 
 *     def as_tuple(self):             # <<<<<<<<<<<<<<
 *         """Return a tuple (sign, coeff, exp) so that
 *         self == (-1) ** sign * coeff * 10 ** exp."""
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_23as_tuple(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_22as_tuple[] = "Return a tuple (sign, coeff, exp) so that\n        self == (-1) ** sign * coeff * 10 ** exp.";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_23as_tuple(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("as_tuple (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_22as_tuple(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_22as_tuple(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_v_v = NULL;
  PyObject *__pyx_v_sign = NULL;
  PyObject *__pyx_v_coeff = NULL;
  int __pyx_v_exp;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("as_tuple", 0);

  /* "_cdecimalfp.pyx":365
 *         """Return a tuple (sign, coeff, exp) so that
 *         self == (-1) ** sign * coeff * 10 ** exp."""
 *         v = self._value             # <<<<<<<<<<<<<<
 *         sign = int(v < 0)
 *         coeff = abs(v)
 */
  __pyx_t_1 = __pyx_v_self->_value;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_v_v = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":366
 *         self == (-1) ** sign * coeff * 10 ** exp."""
 *         v = self._value
 *         sign = int(v < 0)             # <<<<<<<<<<<<<<
 *         coeff = abs(v)
 *         exp = - self._precision
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_v, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = PyNumber_Int(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_sign = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":367
 *         v = self._value
 *         sign = int(v < 0)
 *         coeff = abs(v)             # <<<<<<<<<<<<<<
 *         exp = - self._precision
 *         return sign, coeff, exp
 */
  __pyx_t_2 = PyNumber_Absolute(__pyx_v_v); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 367; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_coeff = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":368
 *         sign = int(v < 0)
 *         coeff = abs(v)
 *         exp = - self._precision             # <<<<<<<<<<<<<<
 *         return sign, coeff, exp
 * 
 */
  __pyx_v_exp = (-__pyx_v_self->_precision);

  /* "_cdecimalfp.pyx":369
 *         coeff = abs(v)
 *         exp = - self._precision
 *         return sign, coeff, exp             # <<<<<<<<<<<<<<
 * 
 *     # return lowest fraction equal to self
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_exp); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 369; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_sign);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_sign);
  __Pyx_GIVEREF(__pyx_v_sign);
  __Pyx_INCREF(__pyx_v_coeff);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_coeff);
  __Pyx_GIVEREF(__pyx_v_coeff);
  PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":362
 *         return result
 * 
 *     def as_tuple(self):             # <<<<<<<<<<<<<<
 *         """Return a tuple (sign, coeff, exp) so that
 *         self == (-1) ** sign * coeff * 10 ** exp."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.as_tuple", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_v);
  __Pyx_XDECREF(__pyx_v_sign);
  __Pyx_XDECREF(__pyx_v_coeff);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":372
 * 
 *     # return lowest fraction equal to self
 *     def as_integer_ratio(self):             # <<<<<<<<<<<<<<
 *         """Return the pair of numerator and denominator with the smallest
 *         positive denominator, whose ratio is equal to self."""
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_25as_integer_ratio(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_24as_integer_ratio[] = "Return the pair of numerator and denominator with the smallest\n        positive denominator, whose ratio is equal to self.";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_25as_integer_ratio(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("as_integer_ratio (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_24as_integer_ratio(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_24as_integer_ratio(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_v_n = NULL;
  PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_v_g = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  Py_ssize_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("as_integer_ratio", 0);

  /* "_cdecimalfp.pyx":375
 *         """Return the pair of numerator and denominator with the smallest
 *         positive denominator, whose ratio is equal to self."""
 *         n, d = self._value, base10pow(self._precision)             # <<<<<<<<<<<<<<
 *         g = gcd(n, d)
 *         return n // g, d // g
 */
  __pyx_t_1 = __pyx_v_self->_value;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_self->_precision); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 375; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_n = __pyx_t_1;
  __pyx_t_1 = 0;
  __pyx_v_d = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":376
 *         positive denominator, whose ratio is equal to self."""
 *         n, d = self._value, base10pow(self._precision)
 *         g = gcd(n, d)             # <<<<<<<<<<<<<<
 *         return n // g, d // g
 * 
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_gcd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = NULL;
  __pyx_t_4 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
      __pyx_t_4 = 1;
    }
  }
  __pyx_t_5 = PyTuple_New(2+__pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  if (__pyx_t_3) {
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = NULL;
  }
  __Pyx_INCREF(__pyx_v_n);
  PyTuple_SET_ITEM(__pyx_t_5, 0+__pyx_t_4, __pyx_v_n);
  __Pyx_GIVEREF(__pyx_v_n);
  __Pyx_INCREF(__pyx_v_d);
  PyTuple_SET_ITEM(__pyx_t_5, 1+__pyx_t_4, __pyx_v_d);
  __Pyx_GIVEREF(__pyx_v_d);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 376; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_g = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":377
 *         n, d = self._value, base10pow(self._precision)
 *         g = gcd(n, d)
 *         return n // g, d // g             # <<<<<<<<<<<<<<
 * 
 *     def __copy__(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = PyNumber_FloorDivide(__pyx_v_n, __pyx_v_g); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyNumber_FloorDivide(__pyx_v_d, __pyx_v_g); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 377; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_2 = 0;
  __pyx_t_1 = 0;
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":372
 * 
 *     # return lowest fraction equal to self
 *     def as_integer_ratio(self):             # <<<<<<<<<<<<<<
 *         """Return the pair of numerator and denominator with the smallest
 *         positive denominator, whose ratio is equal to self."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.as_integer_ratio", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_n);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XDECREF(__pyx_v_g);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":379
 *         return n // g, d // g
 * 
 *     def __copy__(self):             # <<<<<<<<<<<<<<
 *         """Return self (Decimal instances are immutable)."""
 *         return self
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_27__copy__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_26__copy__[] = "Return self (Decimal instances are immutable).";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_27__copy__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__copy__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_26__copy__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_26__copy__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__copy__", 0);

  /* "_cdecimalfp.pyx":381
 *     def __copy__(self):
 *         """Return self (Decimal instances are immutable)."""
 *         return self             # <<<<<<<<<<<<<<
 * 
 *     def __deepcopy__(self, memo):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __pyx_r = ((PyObject *)__pyx_v_self);
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":379
 *         return n // g, d // g
 * 
 *     def __copy__(self):             # <<<<<<<<<<<<<<
 *         """Return self (Decimal instances are immutable)."""
 *         return self
 */

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":383
 *         return self
 * 
 *     def __deepcopy__(self, memo):             # <<<<<<<<<<<<<<
 *         return self.__copy__()
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_29__deepcopy__(PyObject *__pyx_v_self, PyObject *__pyx_v_memo); /*proto*/
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_29__deepcopy__(PyObject *__pyx_v_self, PyObject *__pyx_v_memo) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__deepcopy__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_28__deepcopy__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self), ((PyObject *)__pyx_v_memo));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_28__deepcopy__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_memo) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__deepcopy__", 0);

  /* "_cdecimalfp.pyx":384
 * 
 *     def __deepcopy__(self, memo):
 *         return self.__copy__()             # <<<<<<<<<<<<<<
 * 
 *     def __reduce__(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_copy); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 384; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":383
 *         return self
 * 
 *     def __deepcopy__(self, memo):             # <<<<<<<<<<<<<<
 *         return self.__copy__()
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__deepcopy__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":386
 *         return self.__copy__()
 * 
 *     def __reduce__(self):             # <<<<<<<<<<<<<<
 *         return (Decimal, (None, None), (self._value, self._precision))
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_31__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_31__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_30__reduce__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_30__reduce__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__reduce__", 0);

  /* "_cdecimalfp.pyx":387
 * 
 *     def __reduce__(self):
 *         return (Decimal, (None, None), (self._value, self._precision))             # <<<<<<<<<<<<<<
 * 
 *     def __setstate__(self, state):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->_precision); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_self->_value);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->_value);
  __Pyx_GIVEREF(__pyx_v_self->_value);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_1 = 0;
  __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)));
  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)));
  __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)));
  __Pyx_INCREF(__pyx_tuple__3);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);
  PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;
  __pyx_r = __pyx_t_1;
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":386
 *         return self.__copy__()
 * 
 *     def __reduce__(self):             # <<<<<<<<<<<<<<
 *         return (Decimal, (None, None), (self._value, self._precision))
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":389
 *         return (Decimal, (None, None), (self._value, self._precision))
 * 
 *     def __setstate__(self, state):             # <<<<<<<<<<<<<<
 *         self._value, self._precision = state
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_33__setstate__(PyObject *__pyx_v_self, PyObject *__pyx_v_state); /*proto*/
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_33__setstate__(PyObject *__pyx_v_self, PyObject *__pyx_v_state) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__setstate__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_32__setstate__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self), ((PyObject *)__pyx_v_state));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_32__setstate__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_state) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *(*__pyx_t_4)(PyObject *);
  int __pyx_t_5;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__setstate__", 0);

  /* "_cdecimalfp.pyx":390
 * 
 *     def __setstate__(self, state):
 *         self._value, self._precision = state             # <<<<<<<<<<<<<<
 * 
 *     # string representation
 */
  if ((likely(PyTuple_CheckExact(__pyx_v_state))) || (PyList_CheckExact(__pyx_v_state))) {
    PyObject* sequence = __pyx_v_state;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_2 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_1);
    __Pyx_INCREF(__pyx_t_2);
    #else
    __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    #endif
  } else {
    Py_ssize_t index = -1;
    __pyx_t_3 = PyObject_GetIter(__pyx_v_state); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = Py_TYPE(__pyx_t_3)->tp_iternext;
    index = 0; __pyx_t_1 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_1)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_1);
    index = 1; __pyx_t_2 = __pyx_t_4(__pyx_t_3); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_4(__pyx_t_3), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = NULL;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_4 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 390; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_self->_value);
  __Pyx_DECREF(__pyx_v_self->_value);
  __pyx_v_self->_value = __pyx_t_1;
  __pyx_t_1 = 0;
  __pyx_v_self->_precision = __pyx_t_5;

  /* "_cdecimalfp.pyx":389
 *         return (Decimal, (None, None), (self._value, self._precision))
 * 
 *     def __setstate__(self, state):             # <<<<<<<<<<<<<<
 *         self._value, self._precision = state
 * 
 */

  /* function exit code */
  __pyx_r = Py_None; __Pyx_INCREF(Py_None);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__setstate__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":393
 * 
 *     # string representation
 *     def __repr__(self):             # <<<<<<<<<<<<<<
 *         """repr(self)"""
 *         cdef int sp, rp, n
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_35__repr__(PyObject *__pyx_v_self); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_34__repr__[] = "repr(self)";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_34__repr__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_35__repr__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_34__repr__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_34__repr__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  int __pyx_v_sp;
  int __pyx_v_rp;
  int __pyx_v_n;
  PyObject *__pyx_v_rv = NULL;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  Py_ssize_t __pyx_t_6;
  PyObject *__pyx_t_7 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__repr__", 0);

  /* "_cdecimalfp.pyx":396
 *         """repr(self)"""
 *         cdef int sp, rp, n
 *         sp = self._precision             # <<<<<<<<<<<<<<
 *         rv, rp = _reduce(self)
 *         if rp == 0:
 */
  __pyx_t_1 = __pyx_v_self->_precision;
  __pyx_v_sp = __pyx_t_1;

  /* "_cdecimalfp.pyx":397
 *         cdef int sp, rp, n
 *         sp = self._precision
 *         rv, rp = _reduce(self)             # <<<<<<<<<<<<<<
 *         if rp == 0:
 *             s = str(rv)
 */
  __pyx_t_2 = __pyx_f_11_cdecimalfp__reduce(__pyx_v_self); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (likely(__pyx_t_2 != Py_None)) {
    PyObject* sequence = __pyx_t_2;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
    __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_4);
    #else
    __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    #endif
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  } else {
    __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_t_4); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 397; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_rv = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_rp = __pyx_t_1;

  /* "_cdecimalfp.pyx":398
 *         sp = self._precision
 *         rv, rp = _reduce(self)
 *         if rp == 0:             # <<<<<<<<<<<<<<
 *             s = str(rv)
 *         else:
 */
  __pyx_t_5 = ((__pyx_v_rp == 0) != 0);
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":399
 *         rv, rp = _reduce(self)
 *         if rp == 0:
 *             s = str(rv)             # <<<<<<<<<<<<<<
 *         else:
 *             s = str(abs(rv))
 */
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_v_rv);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_rv);
    __Pyx_GIVEREF(__pyx_v_rv);
    __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 399; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_s = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L3;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":401
 *             s = str(rv)
 *         else:
 *             s = str(abs(rv))             # <<<<<<<<<<<<<<
 *             n = len(s)
 *             if n > rp:
 */
    __pyx_t_4 = PyNumber_Absolute(__pyx_v_rv); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)(&PyString_Type))), __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 401; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_s = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "_cdecimalfp.pyx":402
 *         else:
 *             s = str(abs(rv))
 *             n = len(s)             # <<<<<<<<<<<<<<
 *             if n > rp:
 *                 s = "'%s%s.%s'" % ((rv < 0)*'-', s[0:-rp], s[-rp:])
 */
    __pyx_t_6 = PyObject_Length(__pyx_v_s); if (unlikely(__pyx_t_6 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 402; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_n = __pyx_t_6;

    /* "_cdecimalfp.pyx":403
 *             s = str(abs(rv))
 *             n = len(s)
 *             if n > rp:             # <<<<<<<<<<<<<<
 *                 s = "'%s%s.%s'" % ((rv < 0)*'-', s[0:-rp], s[-rp:])
 *             else:
 */
    __pyx_t_5 = ((__pyx_v_n > __pyx_v_rp) != 0);
    if (__pyx_t_5) {

      /* "_cdecimalfp.pyx":404
 *             n = len(s)
 *             if n > rp:
 *                 s = "'%s%s.%s'" % ((rv < 0)*'-', s[0:-rp], s[-rp:])             # <<<<<<<<<<<<<<
 *             else:
 *                 s = "'%s0.%s%s'" % ((rv < 0)*'-', (rp-n)*'0', s)
 */
      __pyx_t_4 = PyObject_RichCompare(__pyx_v_rv, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_2 = PyNumber_Multiply(__pyx_t_4, __pyx_kp_s__4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_v_s, 0, (-__pyx_v_rp), NULL, NULL, NULL, 1, 1, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_3 = __Pyx_PyObject_GetSlice(__pyx_v_s, (-__pyx_v_rp), 0, NULL, NULL, NULL, 1, 0, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_7 = PyTuple_New(3); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_2);
      __Pyx_GIVEREF(__pyx_t_2);
      PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_4);
      PyTuple_SET_ITEM(__pyx_t_7, 2, __pyx_t_3);
      __Pyx_GIVEREF(__pyx_t_3);
      __pyx_t_2 = 0;
      __pyx_t_4 = 0;
      __pyx_t_3 = 0;
      __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_s_s_s, __pyx_t_7); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 404; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_DECREF_SET(__pyx_v_s, __pyx_t_3);
      __pyx_t_3 = 0;
      goto __pyx_L4;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":406
 *                 s = "'%s%s.%s'" % ((rv < 0)*'-', s[0:-rp], s[-rp:])
 *             else:
 *                 s = "'%s0.%s%s'" % ((rv < 0)*'-', (rp-n)*'0', s)             # <<<<<<<<<<<<<<
 *         if sp == rp:
 *             return "Decimal(%s)" % (s)
 */
      __pyx_t_3 = PyObject_RichCompare(__pyx_v_rv, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_7 = PyNumber_Multiply(__pyx_t_3, __pyx_kp_s__4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_3 = __Pyx_PyInt_From_int((__pyx_v_rp - __pyx_v_n)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_4 = PyNumber_Multiply(__pyx_t_3, __pyx_kp_s_0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_3 = PyTuple_New(3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_7);
      PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_4);
      __Pyx_INCREF(__pyx_v_s);
      PyTuple_SET_ITEM(__pyx_t_3, 2, __pyx_v_s);
      __Pyx_GIVEREF(__pyx_v_s);
      __pyx_t_7 = 0;
      __pyx_t_4 = 0;
      __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_s0_s_s, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 406; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_DECREF_SET(__pyx_v_s, __pyx_t_4);
      __pyx_t_4 = 0;
    }
    __pyx_L4:;
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":407
 *             else:
 *                 s = "'%s0.%s%s'" % ((rv < 0)*'-', (rp-n)*'0', s)
 *         if sp == rp:             # <<<<<<<<<<<<<<
 *             return "Decimal(%s)" % (s)
 *         else:
 */
  __pyx_t_5 = ((__pyx_v_sp == __pyx_v_rp) != 0);
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":408
 *                 s = "'%s0.%s%s'" % ((rv < 0)*'-', (rp-n)*'0', s)
 *         if sp == rp:
 *             return "Decimal(%s)" % (s)             # <<<<<<<<<<<<<<
 *         else:
 *             return "Decimal(%s, %s)" % (s, sp)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Decimal_s, __pyx_v_s); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 408; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":410
 *             return "Decimal(%s)" % (s)
 *         else:
 *             return "Decimal(%s, %s)" % (s, sp)             # <<<<<<<<<<<<<<
 * 
 *     def __str__(self):
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_sp); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_s);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_s);
    __Pyx_GIVEREF(__pyx_v_s);
    PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __pyx_t_4 = 0;
    __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Decimal_s_s, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 410; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":393
 * 
 *     # string representation
 *     def __repr__(self):             # <<<<<<<<<<<<<<
 *         """repr(self)"""
 *         cdef int sp, rp, n
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_rv);
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":412
 *             return "Decimal(%s, %s)" % (s, sp)
 * 
 *     def __str__(self):             # <<<<<<<<<<<<<<
 *         """str(self)"""
 *         sp = self._precision
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_37__str__(PyObject *__pyx_v_self); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_36__str__[] = "str(self)";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_36__str__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_37__str__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__str__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_36__str__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_36__str__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  int __pyx_v_sp;
  PyObject *__pyx_v_i = NULL;
  PyObject *__pyx_v_f = NULL;
  PyObject *__pyx_v_s = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__str__", 0);

  /* "_cdecimalfp.pyx":414
 *     def __str__(self):
 *         """str(self)"""
 *         sp = self._precision             # <<<<<<<<<<<<<<
 *         if sp == 0:
 *             return "%i" % self._value
 */
  __pyx_t_1 = __pyx_v_self->_precision;
  __pyx_v_sp = __pyx_t_1;

  /* "_cdecimalfp.pyx":415
 *         """str(self)"""
 *         sp = self._precision
 *         if sp == 0:             # <<<<<<<<<<<<<<
 *             return "%i" % self._value
 *         else:
 */
  __pyx_t_2 = ((__pyx_v_sp == 0) != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":416
 *         sp = self._precision
 *         if sp == 0:
 *             return "%i" % self._value             # <<<<<<<<<<<<<<
 *         else:
 *             i = _int(self._value, self._precision)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_i, __pyx_v_self->_value); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 416; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":418
 *             return "%i" % self._value
 *         else:
 *             i = _int(self._value, self._precision)             # <<<<<<<<<<<<<<
 *             f = _frac(self._value, self._precision)
 *             s = (i == 0 and f < 0)*'-'  # -1 < self < 0 => i = 0 and f < 0 !!!
 */
    __pyx_t_3 = __pyx_v_self->_value;
    __Pyx_INCREF(__pyx_t_3);
    __pyx_t_4 = __pyx_f_11_cdecimalfp__int(__pyx_t_3, __pyx_v_self->_precision); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 418; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_i = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "_cdecimalfp.pyx":419
 *         else:
 *             i = _int(self._value, self._precision)
 *             f = _frac(self._value, self._precision)             # <<<<<<<<<<<<<<
 *             s = (i == 0 and f < 0)*'-'  # -1 < self < 0 => i = 0 and f < 0 !!!
 *             return '%s%i.%0*i' % (s, i, sp, abs(f))
 */
    __pyx_t_4 = __pyx_v_self->_value;
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_3 = __pyx_f_11_cdecimalfp__frac(__pyx_t_4, __pyx_v_self->_precision); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 419; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_v_f = __pyx_t_3;
    __pyx_t_3 = 0;

    /* "_cdecimalfp.pyx":420
 *             i = _int(self._value, self._precision)
 *             f = _frac(self._value, self._precision)
 *             s = (i == 0 and f < 0)*'-'  # -1 < self < 0 => i = 0 and f < 0 !!!             # <<<<<<<<<<<<<<
 *             return '%s%i.%0*i' % (s, i, sp, abs(f))
 * 
 */
    __pyx_t_4 = PyObject_RichCompare(__pyx_v_i, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_2) {
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      __Pyx_INCREF(__pyx_t_4);
      __pyx_t_3 = __pyx_t_4;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      goto __pyx_L4_bool_binop_done;
    }
    __pyx_t_4 = PyObject_RichCompare(__pyx_v_f, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_3 = __pyx_t_4;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_L4_bool_binop_done:;
    __pyx_t_4 = PyNumber_Multiply(__pyx_t_3, __pyx_kp_s__4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 420; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_s = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "_cdecimalfp.pyx":421
 *             f = _frac(self._value, self._precision)
 *             s = (i == 0 and f < 0)*'-'  # -1 < self < 0 => i = 0 and f < 0 !!!
 *             return '%s%i.%0*i' % (s, i, sp, abs(f))             # <<<<<<<<<<<<<<
 * 
 *     def __lstr__(self):
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyInt_From_int(__pyx_v_sp); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = PyNumber_Absolute(__pyx_v_f); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_5 = PyTuple_New(4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_v_s);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_s);
    __Pyx_GIVEREF(__pyx_v_s);
    __Pyx_INCREF(__pyx_v_i);
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_v_i);
    __Pyx_GIVEREF(__pyx_v_i);
    PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_5, 3, __pyx_t_3);
    __Pyx_GIVEREF(__pyx_t_3);
    __pyx_t_4 = 0;
    __pyx_t_3 = 0;
    __pyx_t_3 = __Pyx_PyString_Format(__pyx_kp_s_s_i_0_i, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 421; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":412
 *             return "Decimal(%s, %s)" % (s, sp)
 * 
 *     def __str__(self):             # <<<<<<<<<<<<<<
 *         """str(self)"""
 *         sp = self._precision
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__str__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_XDECREF(__pyx_v_f);
  __Pyx_XDECREF(__pyx_v_s);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":423
 *             return '%s%i.%0*i' % (s, i, sp, abs(f))
 * 
 *     def __lstr__(self):             # <<<<<<<<<<<<<<
 *         """locale.str(self)"""
 *         return self.__format__('n')
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_39__lstr__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_38__lstr__[] = "locale.str(self)";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_39__lstr__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__lstr__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_38__lstr__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_38__lstr__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__lstr__", 0);

  /* "_cdecimalfp.pyx":425
 *     def __lstr__(self):
 *         """locale.str(self)"""
 *         return self.__format__('n')             # <<<<<<<<<<<<<<
 * 
 *     def __format__(self, fmtSpec):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_format_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":423
 *             return '%s%i.%0*i' % (s, i, sp, abs(f))
 * 
 *     def __lstr__(self):             # <<<<<<<<<<<<<<
 *         """locale.str(self)"""
 *         return self.__format__('n')
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__lstr__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":427
 *         return self.__format__('n')
 * 
 *     def __format__(self, fmtSpec):             # <<<<<<<<<<<<<<
 *         """Return `self` converted to a string according to given format
 *         specifier.
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_41__format__(PyObject *__pyx_v_self, PyObject *__pyx_v_fmtSpec); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_40__format__[] = "Return `self` converted to a string according to given format\n        specifier.\n\n        Args:\n            fmtSpec (str): a standard format specifier for a number\n\n        Returns:\n            str: `self` converted to a string according to `fmtSpec`\n        ";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_41__format__(PyObject *__pyx_v_self, PyObject *__pyx_v_fmtSpec) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__format__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_40__format__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self), ((PyObject *)__pyx_v_fmtSpec));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_40__format__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_fmtSpec) {
  PyObject *__pyx_v_fmtFill = NULL;
  PyObject *__pyx_v_fmtAlign = NULL;
  PyObject *__pyx_v_fmtSign = NULL;
  PyObject *__pyx_v_fmtMinWidth = NULL;
  PyObject *__pyx_v_fmtThousandsSep = NULL;
  PyObject *__pyx_v_fmtGrouping = NULL;
  PyObject *__pyx_v_fmtDecimalPoint = NULL;
  PyObject *__pyx_v_fmtPrecision = NULL;
  PyObject *__pyx_v_fmtType = NULL;
  PyObject *__pyx_v_nToFill = NULL;
  int __pyx_v_prec;
  PyObject *__pyx_v_percentSign = NULL;
  PyObject *__pyx_v_xtraShift = NULL;
  PyObject *__pyx_v_val = NULL;
  PyObject *__pyx_v_sign = NULL;
  PyObject *__pyx_v_rawDigits = NULL;
  PyObject *__pyx_v_decimalPoint = NULL;
  PyObject *__pyx_v_fracPart = NULL;
  PyObject *__pyx_v_intPart = NULL;
  PyObject *__pyx_v_raw = NULL;
  PyObject *__pyx_v_fmt = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *__pyx_t_10 = NULL;
  PyObject *__pyx_t_11 = NULL;
  PyObject *(*__pyx_t_12)(PyObject *);
  int __pyx_t_13;
  int __pyx_t_14;
  int __pyx_t_15;
  Py_ssize_t __pyx_t_16;
  long __pyx_t_17;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__format__", 0);

  /* "_cdecimalfp.pyx":439
 *         (fmtFill, fmtAlign, fmtSign, fmtMinWidth, fmtThousandsSep,
 *             fmtGrouping, fmtDecimalPoint, fmtPrecision,
 *             fmtType) = _getFormatParams(fmtSpec)             # <<<<<<<<<<<<<<
 *         nToFill = fmtMinWidth
 *         prec = self._precision
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_getFormatParams); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_fmtSpec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(__pyx_v_fmtSpec);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_fmtSpec);
    __Pyx_GIVEREF(__pyx_v_fmtSpec);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 439; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 9)) {
      if (size > 9) __Pyx_RaiseTooManyValuesError(9);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyTuple_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyTuple_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyTuple_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyTuple_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyTuple_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyTuple_GET_ITEM(sequence, 8); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_4 = PyList_GET_ITEM(sequence, 1); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 2); 
      __pyx_t_5 = PyList_GET_ITEM(sequence, 3); 
      __pyx_t_6 = PyList_GET_ITEM(sequence, 4); 
      __pyx_t_7 = PyList_GET_ITEM(sequence, 5); 
      __pyx_t_8 = PyList_GET_ITEM(sequence, 6); 
      __pyx_t_9 = PyList_GET_ITEM(sequence, 7); 
      __pyx_t_10 = PyList_GET_ITEM(sequence, 8); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_t_9);
    __Pyx_INCREF(__pyx_t_10);
    #else
    {
      Py_ssize_t i;
      PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_4,&__pyx_t_3,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
      for (i=0; i < 9; i++) {
        PyObject* item = PySequence_ITEM(sequence, i); if (unlikely(!item)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(item);
        *(temps[i]) = item;
      }
    }
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    PyObject** temps[9] = {&__pyx_t_2,&__pyx_t_4,&__pyx_t_3,&__pyx_t_5,&__pyx_t_6,&__pyx_t_7,&__pyx_t_8,&__pyx_t_9,&__pyx_t_10};
    __pyx_t_11 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_11);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_12 = Py_TYPE(__pyx_t_11)->tp_iternext;
    for (index=0; index < 9; index++) {
      PyObject* item = __pyx_t_12(__pyx_t_11); if (unlikely(!item)) goto __pyx_L3_unpacking_failed;
      __Pyx_GOTREF(item);
      *(temps[index]) = item;
    }
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_12(__pyx_t_11), 9) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_12 = NULL;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    __pyx_t_12 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }

  /* "_cdecimalfp.pyx":437
 *             str: `self` converted to a string according to `fmtSpec`
 *         """
 *         (fmtFill, fmtAlign, fmtSign, fmtMinWidth, fmtThousandsSep,             # <<<<<<<<<<<<<<
 *             fmtGrouping, fmtDecimalPoint, fmtPrecision,
 *             fmtType) = _getFormatParams(fmtSpec)
 */
  __pyx_v_fmtFill = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_fmtAlign = __pyx_t_4;
  __pyx_t_4 = 0;
  __pyx_v_fmtSign = __pyx_t_3;
  __pyx_t_3 = 0;
  __pyx_v_fmtMinWidth = __pyx_t_5;
  __pyx_t_5 = 0;
  __pyx_v_fmtThousandsSep = __pyx_t_6;
  __pyx_t_6 = 0;
  __pyx_v_fmtGrouping = __pyx_t_7;
  __pyx_t_7 = 0;
  __pyx_v_fmtDecimalPoint = __pyx_t_8;
  __pyx_t_8 = 0;
  __pyx_v_fmtPrecision = __pyx_t_9;
  __pyx_t_9 = 0;
  __pyx_v_fmtType = __pyx_t_10;
  __pyx_t_10 = 0;

  /* "_cdecimalfp.pyx":440
 *             fmtGrouping, fmtDecimalPoint, fmtPrecision,
 *             fmtType) = _getFormatParams(fmtSpec)
 *         nToFill = fmtMinWidth             # <<<<<<<<<<<<<<
 *         prec = self._precision
 *         if fmtPrecision is None:
 */
  __Pyx_INCREF(__pyx_v_fmtMinWidth);
  __pyx_v_nToFill = __pyx_v_fmtMinWidth;

  /* "_cdecimalfp.pyx":441
 *             fmtType) = _getFormatParams(fmtSpec)
 *         nToFill = fmtMinWidth
 *         prec = self._precision             # <<<<<<<<<<<<<<
 *         if fmtPrecision is None:
 *             fmtPrecision = prec
 */
  __pyx_t_13 = __pyx_v_self->_precision;
  __pyx_v_prec = __pyx_t_13;

  /* "_cdecimalfp.pyx":442
 *         nToFill = fmtMinWidth
 *         prec = self._precision
 *         if fmtPrecision is None:             # <<<<<<<<<<<<<<
 *             fmtPrecision = prec
 *         if fmtType == '%':
 */
  __pyx_t_14 = (__pyx_v_fmtPrecision == Py_None);
  __pyx_t_15 = (__pyx_t_14 != 0);
  if (__pyx_t_15) {

    /* "_cdecimalfp.pyx":443
 *         prec = self._precision
 *         if fmtPrecision is None:
 *             fmtPrecision = prec             # <<<<<<<<<<<<<<
 *         if fmtType == '%':
 *             percentSign = '%'
 */
    __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_prec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 443; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_fmtPrecision, __pyx_t_1);
    __pyx_t_1 = 0;
    goto __pyx_L5;
  }
  __pyx_L5:;

  /* "_cdecimalfp.pyx":444
 *         if fmtPrecision is None:
 *             fmtPrecision = prec
 *         if fmtType == '%':             # <<<<<<<<<<<<<<
 *             percentSign = '%'
 *             nToFill -= 1
 */
  __pyx_t_15 = (__Pyx_PyString_Equals(__pyx_v_fmtType, __pyx_kp_s__6, Py_EQ)); if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 444; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_15) {

    /* "_cdecimalfp.pyx":445
 *             fmtPrecision = prec
 *         if fmtType == '%':
 *             percentSign = '%'             # <<<<<<<<<<<<<<
 *             nToFill -= 1
 *             xtraShift = 2
 */
    __Pyx_INCREF(__pyx_kp_s__6);
    __pyx_v_percentSign = __pyx_kp_s__6;

    /* "_cdecimalfp.pyx":446
 *         if fmtType == '%':
 *             percentSign = '%'
 *             nToFill -= 1             # <<<<<<<<<<<<<<
 *             xtraShift = 2
 *         else:
 */
    __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_v_nToFill, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 446; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_nToFill, __pyx_t_1);
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":447
 *             percentSign = '%'
 *             nToFill -= 1
 *             xtraShift = 2             # <<<<<<<<<<<<<<
 *         else:
 *             percentSign = ''
 */
    __Pyx_INCREF(__pyx_int_2);
    __pyx_v_xtraShift = __pyx_int_2;
    goto __pyx_L6;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":449
 *             xtraShift = 2
 *         else:
 *             percentSign = ''             # <<<<<<<<<<<<<<
 *             xtraShift = 0
 *         val = _get_adjusted_value(self, fmtPrecision + xtraShift)
 */
    __Pyx_INCREF(__pyx_kp_s__7);
    __pyx_v_percentSign = __pyx_kp_s__7;

    /* "_cdecimalfp.pyx":450
 *         else:
 *             percentSign = ''
 *             xtraShift = 0             # <<<<<<<<<<<<<<
 *         val = _get_adjusted_value(self, fmtPrecision + xtraShift)
 *         if val < 0:
 */
    __Pyx_INCREF(__pyx_int_0);
    __pyx_v_xtraShift = __pyx_int_0;
  }
  __pyx_L6:;

  /* "_cdecimalfp.pyx":451
 *             percentSign = ''
 *             xtraShift = 0
 *         val = _get_adjusted_value(self, fmtPrecision + xtraShift)             # <<<<<<<<<<<<<<
 *         if val < 0:
 *             sign = '-'
 */
  __pyx_t_1 = PyNumber_Add(__pyx_v_fmtPrecision, __pyx_v_xtraShift); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_13 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_13 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __pyx_f_11_cdecimalfp__get_adjusted_value(__pyx_v_self, __pyx_t_13, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 451; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_val = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":452
 *             xtraShift = 0
 *         val = _get_adjusted_value(self, fmtPrecision + xtraShift)
 *         if val < 0:             # <<<<<<<<<<<<<<
 *             sign = '-'
 *             nToFill -= 1
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_val, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 452; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_15) {

    /* "_cdecimalfp.pyx":453
 *         val = _get_adjusted_value(self, fmtPrecision + xtraShift)
 *         if val < 0:
 *             sign = '-'             # <<<<<<<<<<<<<<
 *             nToFill -= 1
 *             val = abs(val)
 */
    __Pyx_INCREF(__pyx_kp_s__4);
    __pyx_v_sign = __pyx_kp_s__4;

    /* "_cdecimalfp.pyx":454
 *         if val < 0:
 *             sign = '-'
 *             nToFill -= 1             # <<<<<<<<<<<<<<
 *             val = abs(val)
 *         elif fmtSign == '-':
 */
    __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_v_nToFill, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 454; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_nToFill, __pyx_t_1);
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":455
 *             sign = '-'
 *             nToFill -= 1
 *             val = abs(val)             # <<<<<<<<<<<<<<
 *         elif fmtSign == '-':
 *             sign = ''
 */
    __pyx_t_1 = PyNumber_Absolute(__pyx_v_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 455; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_val, __pyx_t_1);
    __pyx_t_1 = 0;
    goto __pyx_L7;
  }

  /* "_cdecimalfp.pyx":456
 *             nToFill -= 1
 *             val = abs(val)
 *         elif fmtSign == '-':             # <<<<<<<<<<<<<<
 *             sign = ''
 *         else:
 */
  __pyx_t_15 = (__Pyx_PyString_Equals(__pyx_v_fmtSign, __pyx_kp_s__4, Py_EQ)); if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 456; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_15) {

    /* "_cdecimalfp.pyx":457
 *             val = abs(val)
 *         elif fmtSign == '-':
 *             sign = ''             # <<<<<<<<<<<<<<
 *         else:
 *             sign = fmtSign
 */
    __Pyx_INCREF(__pyx_kp_s__7);
    __pyx_v_sign = __pyx_kp_s__7;
    goto __pyx_L7;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":459
 *             sign = ''
 *         else:
 *             sign = fmtSign             # <<<<<<<<<<<<<<
 *             nToFill -= 1
 *         rawDigits = "%i" % val
 */
    __Pyx_INCREF(__pyx_v_fmtSign);
    __pyx_v_sign = __pyx_v_fmtSign;

    /* "_cdecimalfp.pyx":460
 *         else:
 *             sign = fmtSign
 *             nToFill -= 1             # <<<<<<<<<<<<<<
 *         rawDigits = "%i" % val
 *         if fmtPrecision:
 */
    __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_v_nToFill, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 460; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_nToFill, __pyx_t_1);
    __pyx_t_1 = 0;
  }
  __pyx_L7:;

  /* "_cdecimalfp.pyx":461
 *             sign = fmtSign
 *             nToFill -= 1
 *         rawDigits = "%i" % val             # <<<<<<<<<<<<<<
 *         if fmtPrecision:
 *             decimalPoint = fmtDecimalPoint
 */
  __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_i, __pyx_v_val); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 461; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_rawDigits = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":462
 *             nToFill -= 1
 *         rawDigits = "%i" % val
 *         if fmtPrecision:             # <<<<<<<<<<<<<<
 *             decimalPoint = fmtDecimalPoint
 *             rawDigits, fracPart = (rawDigits[:-fmtPrecision],
 */
  __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_v_fmtPrecision); if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 462; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_15) {

    /* "_cdecimalfp.pyx":463
 *         rawDigits = "%i" % val
 *         if fmtPrecision:
 *             decimalPoint = fmtDecimalPoint             # <<<<<<<<<<<<<<
 *             rawDigits, fracPart = (rawDigits[:-fmtPrecision],
 *                                    rawDigits[-fmtPrecision:])
 */
    __Pyx_INCREF(__pyx_v_fmtDecimalPoint);
    __pyx_v_decimalPoint = __pyx_v_fmtDecimalPoint;

    /* "_cdecimalfp.pyx":464
 *         if fmtPrecision:
 *             decimalPoint = fmtDecimalPoint
 *             rawDigits, fracPart = (rawDigits[:-fmtPrecision],             # <<<<<<<<<<<<<<
 *                                    rawDigits[-fmtPrecision:])
 *             nToFill -= fmtPrecision + 1
 */
    __pyx_t_1 = PyNumber_Negative(__pyx_v_fmtPrecision); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_16 = __Pyx_PyIndex_AsSsize_t(__pyx_t_1); if (unlikely((__pyx_t_16 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PySequence_GetSlice(__pyx_v_rawDigits, 0, __pyx_t_16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 464; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);

    /* "_cdecimalfp.pyx":465
 *             decimalPoint = fmtDecimalPoint
 *             rawDigits, fracPart = (rawDigits[:-fmtPrecision],
 *                                    rawDigits[-fmtPrecision:])             # <<<<<<<<<<<<<<
 *             nToFill -= fmtPrecision + 1
 *         else:
 */
    __pyx_t_10 = PyNumber_Negative(__pyx_v_fmtPrecision); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __pyx_t_16 = __Pyx_PyIndex_AsSsize_t(__pyx_t_10); if (unlikely((__pyx_t_16 == (Py_ssize_t)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __pyx_t_10 = PySequence_GetSlice(__pyx_v_rawDigits, __pyx_t_16, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 465; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF_SET(__pyx_v_rawDigits, ((PyObject*)__pyx_t_1));
    __pyx_t_1 = 0;
    __pyx_v_fracPart = __pyx_t_10;
    __pyx_t_10 = 0;

    /* "_cdecimalfp.pyx":466
 *             rawDigits, fracPart = (rawDigits[:-fmtPrecision],
 *                                    rawDigits[-fmtPrecision:])
 *             nToFill -= fmtPrecision + 1             # <<<<<<<<<<<<<<
 *         else:
 *             decimalPoint = ''
 */
    __pyx_t_10 = PyNumber_Add(__pyx_v_fmtPrecision, __pyx_int_1); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_v_nToFill, __pyx_t_10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 466; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __Pyx_DECREF_SET(__pyx_v_nToFill, __pyx_t_1);
    __pyx_t_1 = 0;
    goto __pyx_L8;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":468
 *             nToFill -= fmtPrecision + 1
 *         else:
 *             decimalPoint = ''             # <<<<<<<<<<<<<<
 *             fracPart = ''
 *         if fmtAlign == '=':
 */
    __Pyx_INCREF(__pyx_kp_s__7);
    __pyx_v_decimalPoint = __pyx_kp_s__7;

    /* "_cdecimalfp.pyx":469
 *         else:
 *             decimalPoint = ''
 *             fracPart = ''             # <<<<<<<<<<<<<<
 *         if fmtAlign == '=':
 *             intPart = _padDigits(rawDigits, max(0, nToFill), fmtFill,
 */
    __Pyx_INCREF(__pyx_kp_s__7);
    __pyx_v_fracPart = __pyx_kp_s__7;
  }
  __pyx_L8:;

  /* "_cdecimalfp.pyx":470
 *             decimalPoint = ''
 *             fracPart = ''
 *         if fmtAlign == '=':             # <<<<<<<<<<<<<<
 *             intPart = _padDigits(rawDigits, max(0, nToFill), fmtFill,
 *                                  fmtThousandsSep, fmtGrouping)
 */
  __pyx_t_15 = (__Pyx_PyString_Equals(__pyx_v_fmtAlign, __pyx_kp_s__8, Py_EQ)); if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 470; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_15) {

    /* "_cdecimalfp.pyx":471
 *             fracPart = ''
 *         if fmtAlign == '=':
 *             intPart = _padDigits(rawDigits, max(0, nToFill), fmtFill,             # <<<<<<<<<<<<<<
 *                                  fmtThousandsSep, fmtGrouping)
 *             return sign + intPart + decimalPoint + fracPart + percentSign
 */
    __pyx_t_10 = __Pyx_GetModuleGlobalName(__pyx_n_s_padDigits); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_INCREF(__pyx_v_nToFill);
    __pyx_t_9 = __pyx_v_nToFill;
    __pyx_t_17 = 0;
    __pyx_t_7 = __Pyx_PyInt_From_long(__pyx_t_17); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_6 = PyObject_RichCompare(__pyx_t_9, __pyx_t_7, Py_GT); __Pyx_XGOTREF(__pyx_t_6); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_6); if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if (__pyx_t_15) {
      __Pyx_INCREF(__pyx_t_9);
      __pyx_t_8 = __pyx_t_9;
    } else {
      __pyx_t_6 = __Pyx_PyInt_From_long(__pyx_t_17); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_8 = __pyx_t_6;
      __pyx_t_6 = 0;
    }
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;

    /* "_cdecimalfp.pyx":472
 *         if fmtAlign == '=':
 *             intPart = _padDigits(rawDigits, max(0, nToFill), fmtFill,
 *                                  fmtThousandsSep, fmtGrouping)             # <<<<<<<<<<<<<<
 *             return sign + intPart + decimalPoint + fracPart + percentSign
 *         else:
 */
    __pyx_t_9 = NULL;
    __pyx_t_16 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_10))) {
      __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_10);
      if (likely(__pyx_t_9)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_10);
        __Pyx_INCREF(__pyx_t_9);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_10, function);
        __pyx_t_16 = 1;
      }
    }
    __pyx_t_6 = PyTuple_New(5+__pyx_t_16); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    if (__pyx_t_9) {
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_9); __Pyx_GIVEREF(__pyx_t_9); __pyx_t_9 = NULL;
    }
    __Pyx_INCREF(__pyx_v_rawDigits);
    PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_16, __pyx_v_rawDigits);
    __Pyx_GIVEREF(__pyx_v_rawDigits);
    __Pyx_INCREF(__pyx_t_8);
    PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_16, __pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_8);
    __Pyx_INCREF(__pyx_v_fmtFill);
    PyTuple_SET_ITEM(__pyx_t_6, 2+__pyx_t_16, __pyx_v_fmtFill);
    __Pyx_GIVEREF(__pyx_v_fmtFill);
    __Pyx_INCREF(__pyx_v_fmtThousandsSep);
    PyTuple_SET_ITEM(__pyx_t_6, 3+__pyx_t_16, __pyx_v_fmtThousandsSep);
    __Pyx_GIVEREF(__pyx_v_fmtThousandsSep);
    __Pyx_INCREF(__pyx_v_fmtGrouping);
    PyTuple_SET_ITEM(__pyx_t_6, 4+__pyx_t_16, __pyx_v_fmtGrouping);
    __Pyx_GIVEREF(__pyx_v_fmtGrouping);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_10, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 471; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __pyx_v_intPart = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":473
 *             intPart = _padDigits(rawDigits, max(0, nToFill), fmtFill,
 *                                  fmtThousandsSep, fmtGrouping)
 *             return sign + intPart + decimalPoint + fracPart + percentSign             # <<<<<<<<<<<<<<
 *         else:
 *             intPart = _padDigits(rawDigits, 0, fmtFill,
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = PyNumber_Add(__pyx_v_sign, __pyx_v_intPart); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_10 = PyNumber_Add(__pyx_t_1, __pyx_v_decimalPoint); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyNumber_Add(__pyx_t_10, __pyx_v_fracPart); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __pyx_t_10 = PyNumber_Add(__pyx_t_1, __pyx_v_percentSign); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 473; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_r = __pyx_t_10;
    __pyx_t_10 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":475
 *             return sign + intPart + decimalPoint + fracPart + percentSign
 *         else:
 *             intPart = _padDigits(rawDigits, 0, fmtFill,             # <<<<<<<<<<<<<<
 *                                  fmtThousandsSep, fmtGrouping)
 *             raw = sign + intPart + decimalPoint + fracPart + percentSign
 */
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_padDigits); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);

    /* "_cdecimalfp.pyx":476
 *         else:
 *             intPart = _padDigits(rawDigits, 0, fmtFill,
 *                                  fmtThousandsSep, fmtGrouping)             # <<<<<<<<<<<<<<
 *             raw = sign + intPart + decimalPoint + fracPart + percentSign
 *             if nToFill > len(intPart):
 */
    __pyx_t_6 = NULL;
    __pyx_t_16 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_1, function);
        __pyx_t_16 = 1;
      }
    }
    __pyx_t_8 = PyTuple_New(5+__pyx_t_16); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    if (__pyx_t_6) {
      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
    }
    __Pyx_INCREF(__pyx_v_rawDigits);
    PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_16, __pyx_v_rawDigits);
    __Pyx_GIVEREF(__pyx_v_rawDigits);
    __Pyx_INCREF(__pyx_int_0);
    PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_16, __pyx_int_0);
    __Pyx_GIVEREF(__pyx_int_0);
    __Pyx_INCREF(__pyx_v_fmtFill);
    PyTuple_SET_ITEM(__pyx_t_8, 2+__pyx_t_16, __pyx_v_fmtFill);
    __Pyx_GIVEREF(__pyx_v_fmtFill);
    __Pyx_INCREF(__pyx_v_fmtThousandsSep);
    PyTuple_SET_ITEM(__pyx_t_8, 3+__pyx_t_16, __pyx_v_fmtThousandsSep);
    __Pyx_GIVEREF(__pyx_v_fmtThousandsSep);
    __Pyx_INCREF(__pyx_v_fmtGrouping);
    PyTuple_SET_ITEM(__pyx_t_8, 4+__pyx_t_16, __pyx_v_fmtGrouping);
    __Pyx_GIVEREF(__pyx_v_fmtGrouping);
    __pyx_t_10 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_8, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 475; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_intPart = __pyx_t_10;
    __pyx_t_10 = 0;

    /* "_cdecimalfp.pyx":477
 *             intPart = _padDigits(rawDigits, 0, fmtFill,
 *                                  fmtThousandsSep, fmtGrouping)
 *             raw = sign + intPart + decimalPoint + fracPart + percentSign             # <<<<<<<<<<<<<<
 *             if nToFill > len(intPart):
 *                 fmt = "%s%s%i" % (fmtFill, fmtAlign, fmtMinWidth)
 */
    __pyx_t_10 = PyNumber_Add(__pyx_v_sign, __pyx_v_intPart); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __pyx_t_1 = PyNumber_Add(__pyx_t_10, __pyx_v_decimalPoint); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __pyx_t_10 = PyNumber_Add(__pyx_t_1, __pyx_v_fracPart); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_10);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyNumber_Add(__pyx_t_10, __pyx_v_percentSign); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 477; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    __pyx_v_raw = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":478
 *                                  fmtThousandsSep, fmtGrouping)
 *             raw = sign + intPart + decimalPoint + fracPart + percentSign
 *             if nToFill > len(intPart):             # <<<<<<<<<<<<<<
 *                 fmt = "%s%s%i" % (fmtFill, fmtAlign, fmtMinWidth)
 *                 return format(raw, fmt)
 */
    __pyx_t_16 = PyObject_Length(__pyx_v_intPart); if (unlikely(__pyx_t_16 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_1 = PyInt_FromSsize_t(__pyx_t_16); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_10 = PyObject_RichCompare(__pyx_v_nToFill, __pyx_t_1, Py_GT); __Pyx_XGOTREF(__pyx_t_10); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_15 = __Pyx_PyObject_IsTrue(__pyx_t_10); if (unlikely(__pyx_t_15 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 478; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
    if (__pyx_t_15) {

      /* "_cdecimalfp.pyx":479
 *             raw = sign + intPart + decimalPoint + fracPart + percentSign
 *             if nToFill > len(intPart):
 *                 fmt = "%s%s%i" % (fmtFill, fmtAlign, fmtMinWidth)             # <<<<<<<<<<<<<<
 *                 return format(raw, fmt)
 *             else:
 */
      __pyx_t_10 = PyTuple_New(3); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_INCREF(__pyx_v_fmtFill);
      PyTuple_SET_ITEM(__pyx_t_10, 0, __pyx_v_fmtFill);
      __Pyx_GIVEREF(__pyx_v_fmtFill);
      __Pyx_INCREF(__pyx_v_fmtAlign);
      PyTuple_SET_ITEM(__pyx_t_10, 1, __pyx_v_fmtAlign);
      __Pyx_GIVEREF(__pyx_v_fmtAlign);
      __Pyx_INCREF(__pyx_v_fmtMinWidth);
      PyTuple_SET_ITEM(__pyx_t_10, 2, __pyx_v_fmtMinWidth);
      __Pyx_GIVEREF(__pyx_v_fmtMinWidth);
      __pyx_t_1 = __Pyx_PyString_Format(__pyx_kp_s_s_s_i, __pyx_t_10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 479; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0;
      __pyx_v_fmt = ((PyObject*)__pyx_t_1);
      __pyx_t_1 = 0;

      /* "_cdecimalfp.pyx":480
 *             if nToFill > len(intPart):
 *                 fmt = "%s%s%i" % (fmtFill, fmtAlign, fmtMinWidth)
 *                 return format(raw, fmt)             # <<<<<<<<<<<<<<
 *             else:
 *                 return raw
 */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_INCREF(__pyx_v_raw);
      PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_raw);
      __Pyx_GIVEREF(__pyx_v_raw);
      __Pyx_INCREF(__pyx_v_fmt);
      PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_fmt);
      __Pyx_GIVEREF(__pyx_v_fmt);
      __pyx_t_10 = __Pyx_PyObject_Call(__pyx_builtin_format, __pyx_t_1, NULL); if (unlikely(!__pyx_t_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_10);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_r = __pyx_t_10;
      __pyx_t_10 = 0;
      goto __pyx_L0;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":482
 *                 return format(raw, fmt)
 *             else:
 *                 return raw             # <<<<<<<<<<<<<<
 * 
 *     # compare to Decimal or any type that can be converted to a Decimal
 */
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(__pyx_v_raw);
      __pyx_r = __pyx_v_raw;
      goto __pyx_L0;
    }
  }

  /* "_cdecimalfp.pyx":427
 *         return self.__format__('n')
 * 
 *     def __format__(self, fmtSpec):             # <<<<<<<<<<<<<<
 *         """Return `self` converted to a string according to given format
 *         specifier.
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_XDECREF(__pyx_t_10);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__format__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_fmtFill);
  __Pyx_XDECREF(__pyx_v_fmtAlign);
  __Pyx_XDECREF(__pyx_v_fmtSign);
  __Pyx_XDECREF(__pyx_v_fmtMinWidth);
  __Pyx_XDECREF(__pyx_v_fmtThousandsSep);
  __Pyx_XDECREF(__pyx_v_fmtGrouping);
  __Pyx_XDECREF(__pyx_v_fmtDecimalPoint);
  __Pyx_XDECREF(__pyx_v_fmtPrecision);
  __Pyx_XDECREF(__pyx_v_fmtType);
  __Pyx_XDECREF(__pyx_v_nToFill);
  __Pyx_XDECREF(__pyx_v_percentSign);
  __Pyx_XDECREF(__pyx_v_xtraShift);
  __Pyx_XDECREF(__pyx_v_val);
  __Pyx_XDECREF(__pyx_v_sign);
  __Pyx_XDECREF(__pyx_v_rawDigits);
  __Pyx_XDECREF(__pyx_v_decimalPoint);
  __Pyx_XDECREF(__pyx_v_fracPart);
  __Pyx_XDECREF(__pyx_v_intPart);
  __Pyx_XDECREF(__pyx_v_raw);
  __Pyx_XDECREF(__pyx_v_fmt);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":485
 * 
 *     # compare to Decimal or any type that can be converted to a Decimal
 *     def _make_comparable(self, other):             # <<<<<<<<<<<<<<
 *         cdef int selfPrec, otherPrec
 *         cdef Decimal dec
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_43_make_comparable(PyObject *__pyx_v_self, PyObject *__pyx_v_other); /*proto*/
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_43_make_comparable(PyObject *__pyx_v_self, PyObject *__pyx_v_other) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_make_comparable (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_42_make_comparable(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self), ((PyObject *)__pyx_v_other));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_42_make_comparable(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_other) {
  int __pyx_v_selfPrec;
  int __pyx_v_otherPrec;
  PyObject *__pyx_v_num = NULL;
  PyObject *__pyx_v_den = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *(*__pyx_t_9)(PyObject *);
  int __pyx_t_10;
  PyObject *__pyx_t_11 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_make_comparable", 0);

  /* "_cdecimalfp.pyx":488
 *         cdef int selfPrec, otherPrec
 *         cdef Decimal dec
 *         if isinstance(other, Decimal):             # <<<<<<<<<<<<<<
 *             selfPrec, otherPrec = self._precision, (<Decimal>other)._precision
 *             if selfPrec == otherPrec:
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_other, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":489
 *         cdef Decimal dec
 *         if isinstance(other, Decimal):
 *             selfPrec, otherPrec = self._precision, (<Decimal>other)._precision             # <<<<<<<<<<<<<<
 *             if selfPrec == otherPrec:
 *                 return self._value, (<Decimal>other)._value
 */
    __pyx_t_3 = __pyx_v_self->_precision;
    __pyx_t_4 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_other)->_precision;
    __pyx_v_selfPrec = __pyx_t_3;
    __pyx_v_otherPrec = __pyx_t_4;

    /* "_cdecimalfp.pyx":490
 *         if isinstance(other, Decimal):
 *             selfPrec, otherPrec = self._precision, (<Decimal>other)._precision
 *             if selfPrec == otherPrec:             # <<<<<<<<<<<<<<
 *                 return self._value, (<Decimal>other)._value
 *             elif selfPrec < otherPrec:
 */
    __pyx_t_2 = ((__pyx_v_selfPrec == __pyx_v_otherPrec) != 0);
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":491
 *             selfPrec, otherPrec = self._precision, (<Decimal>other)._precision
 *             if selfPrec == otherPrec:
 *                 return self._value, (<Decimal>other)._value             # <<<<<<<<<<<<<<
 *             elif selfPrec < otherPrec:
 *                 return (_get_adjusted_value(self, otherPrec),
 */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 491; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF(__pyx_v_self->_value);
      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_self->_value);
      __Pyx_GIVEREF(__pyx_v_self->_value);
      __Pyx_INCREF(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_other)->_value);
      PyTuple_SET_ITEM(__pyx_t_5, 1, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_other)->_value);
      __Pyx_GIVEREF(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_other)->_value);
      __pyx_r = __pyx_t_5;
      __pyx_t_5 = 0;
      goto __pyx_L0;
    }

    /* "_cdecimalfp.pyx":492
 *             if selfPrec == otherPrec:
 *                 return self._value, (<Decimal>other)._value
 *             elif selfPrec < otherPrec:             # <<<<<<<<<<<<<<
 *                 return (_get_adjusted_value(self, otherPrec),
 *                         (<Decimal>other)._value)
 */
    __pyx_t_2 = ((__pyx_v_selfPrec < __pyx_v_otherPrec) != 0);
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":493
 *                 return self._value, (<Decimal>other)._value
 *             elif selfPrec < otherPrec:
 *                 return (_get_adjusted_value(self, otherPrec),             # <<<<<<<<<<<<<<
 *                         (<Decimal>other)._value)
 *             else:
 */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_5 = __pyx_f_11_cdecimalfp__get_adjusted_value(__pyx_v_self, __pyx_v_otherPrec, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);

      /* "_cdecimalfp.pyx":494
 *             elif selfPrec < otherPrec:
 *                 return (_get_adjusted_value(self, otherPrec),
 *                         (<Decimal>other)._value)             # <<<<<<<<<<<<<<
 *             else:
 *                 return (self._value,
 */
      __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 493; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5);
      __Pyx_GIVEREF(__pyx_t_5);
      __Pyx_INCREF(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_other)->_value);
      PyTuple_SET_ITEM(__pyx_t_6, 1, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_other)->_value);
      __Pyx_GIVEREF(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_other)->_value);
      __pyx_t_5 = 0;
      __pyx_r = __pyx_t_6;
      __pyx_t_6 = 0;
      goto __pyx_L0;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":496
 *                         (<Decimal>other)._value)
 *             else:
 *                 return (self._value,             # <<<<<<<<<<<<<<
 *                         _get_adjusted_value(<Decimal>other, selfPrec))
 *         if isinstance(other, numbers.Integral):
 */
      __Pyx_XDECREF(__pyx_r);

      /* "_cdecimalfp.pyx":497
 *             else:
 *                 return (self._value,
 *                         _get_adjusted_value(<Decimal>other, selfPrec))             # <<<<<<<<<<<<<<
 *         if isinstance(other, numbers.Integral):
 *             return self._value, other * base10pow(self._precision)
 */
      __pyx_t_6 = __pyx_f_11_cdecimalfp__get_adjusted_value(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_other), __pyx_v_selfPrec, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 497; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);

      /* "_cdecimalfp.pyx":496
 *                         (<Decimal>other)._value)
 *             else:
 *                 return (self._value,             # <<<<<<<<<<<<<<
 *                         _get_adjusted_value(<Decimal>other, selfPrec))
 *         if isinstance(other, numbers.Integral):
 */
      __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 496; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF(__pyx_v_self->_value);
      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_self->_value);
      __Pyx_GIVEREF(__pyx_v_self->_value);
      PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6);
      __Pyx_GIVEREF(__pyx_t_6);
      __pyx_t_6 = 0;
      __pyx_r = __pyx_t_5;
      __pyx_t_5 = 0;
      goto __pyx_L0;
    }
  }

  /* "_cdecimalfp.pyx":498
 *                 return (self._value,
 *                         _get_adjusted_value(<Decimal>other, selfPrec))
 *         if isinstance(other, numbers.Integral):             # <<<<<<<<<<<<<<
 *             return self._value, other * base10pow(self._precision)
 *         if isinstance(other, numbers.Rational):
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Integral); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_other, __pyx_t_6); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":499
 *                         _get_adjusted_value(<Decimal>other, selfPrec))
 *         if isinstance(other, numbers.Integral):
 *             return self._value, other * base10pow(self._precision)             # <<<<<<<<<<<<<<
 *         if isinstance(other, numbers.Rational):
 *             return (self.numerator * other.denominator,
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_6 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_self->_precision); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = PyNumber_Multiply(__pyx_v_other, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_v_self->_value);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_self->_value);
    __Pyx_GIVEREF(__pyx_v_self->_value);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_r = __pyx_t_6;
    __pyx_t_6 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":500
 *         if isinstance(other, numbers.Integral):
 *             return self._value, other * base10pow(self._precision)
 *         if isinstance(other, numbers.Rational):             # <<<<<<<<<<<<<<
 *             return (self.numerator * other.denominator,
 *                     other.numerator * self.denominator)
 */
  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_Rational); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_other, __pyx_t_5); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":501
 *             return self._value, other * base10pow(self._precision)
 *         if isinstance(other, numbers.Rational):
 *             return (self.numerator * other.denominator,             # <<<<<<<<<<<<<<
 *                     other.numerator * self.denominator)
 *         if isinstance(other, float):
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_numerator); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_other, __pyx_n_s_denominator); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = PyNumber_Multiply(__pyx_t_5, __pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;

    /* "_cdecimalfp.pyx":502
 *         if isinstance(other, numbers.Rational):
 *             return (self.numerator * other.denominator,
 *                     other.numerator * self.denominator)             # <<<<<<<<<<<<<<
 *         if isinstance(other, float):
 *             num, den = other.as_integer_ratio()
 */
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_other, __pyx_n_s_numerator); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_denominator); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_8 = PyNumber_Multiply(__pyx_t_6, __pyx_t_5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":501
 *             return self._value, other * base10pow(self._precision)
 *         if isinstance(other, numbers.Rational):
 *             return (self.numerator * other.denominator,             # <<<<<<<<<<<<<<
 *                     other.numerator * self.denominator)
 *         if isinstance(other, float):
 */
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_7);
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_8);
    __pyx_t_7 = 0;
    __pyx_t_8 = 0;
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":503
 *             return (self.numerator * other.denominator,
 *                     other.numerator * self.denominator)
 *         if isinstance(other, float):             # <<<<<<<<<<<<<<
 *             num, den = other.as_integer_ratio()
 *             return (self.numerator * den, num * self.denominator)
 */
  __pyx_t_2 = PyFloat_Check(__pyx_v_other); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":504
 *                     other.numerator * self.denominator)
 *         if isinstance(other, float):
 *             num, den = other.as_integer_ratio()             # <<<<<<<<<<<<<<
 *             return (self.numerator * den, num * self.denominator)
 *         if isinstance(other, _StdLibDecimal):
 */
    __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_other, __pyx_n_s_as_integer_ratio); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_7 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_8))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_8);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_8, function);
      }
    }
    if (__pyx_t_7) {
      __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    } else {
      __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_8); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
      PyObject* sequence = __pyx_t_5;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_8 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_8 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_8);
      __Pyx_INCREF(__pyx_t_7);
      #else
      __pyx_t_8 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      #endif
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_6 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_9 = Py_TYPE(__pyx_t_6)->tp_iternext;
      index = 0; __pyx_t_8 = __pyx_t_9(__pyx_t_6); if (unlikely(!__pyx_t_8)) goto __pyx_L8_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_8);
      index = 1; __pyx_t_7 = __pyx_t_9(__pyx_t_6); if (unlikely(!__pyx_t_7)) goto __pyx_L8_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_7);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_9(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_9 = NULL;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      goto __pyx_L9_unpacking_done;
      __pyx_L8_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_t_9 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 504; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_L9_unpacking_done:;
    }
    __pyx_v_num = __pyx_t_8;
    __pyx_t_8 = 0;
    __pyx_v_den = __pyx_t_7;
    __pyx_t_7 = 0;

    /* "_cdecimalfp.pyx":505
 *         if isinstance(other, float):
 *             num, den = other.as_integer_ratio()
 *             return (self.numerator * den, num * self.denominator)             # <<<<<<<<<<<<<<
 *         if isinstance(other, _StdLibDecimal):
 *             return (self, Decimal(other))
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_numerator); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_7 = PyNumber_Multiply(__pyx_t_5, __pyx_v_den); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_denominator); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_8 = PyNumber_Multiply(__pyx_v_num, __pyx_t_5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 505; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_7);
    __Pyx_GIVEREF(__pyx_t_7);
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_8);
    __pyx_t_7 = 0;
    __pyx_t_8 = 0;
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":506
 *             num, den = other.as_integer_ratio()
 *             return (self.numerator * den, num * self.denominator)
 *         if isinstance(other, _StdLibDecimal):             # <<<<<<<<<<<<<<
 *             return (self, Decimal(other))
 *         if isinstance(other, numbers.Complex) and other.imag == 0:
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_other, __pyx_t_5); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":507
 *             return (self.numerator * den, num * self.denominator)
 *         if isinstance(other, _StdLibDecimal):
 *             return (self, Decimal(other))             # <<<<<<<<<<<<<<
 *         if isinstance(other, numbers.Complex) and other.imag == 0:
 *             return self._make_comparable(other.real)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_v_other);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_other);
    __Pyx_GIVEREF(__pyx_v_other);
    __pyx_t_8 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(((PyObject *)__pyx_v_self));
    PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_self));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_8);
    __Pyx_GIVEREF(__pyx_t_8);
    __pyx_t_8 = 0;
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":508
 *         if isinstance(other, _StdLibDecimal):
 *             return (self, Decimal(other))
 *         if isinstance(other, numbers.Complex) and other.imag == 0:             # <<<<<<<<<<<<<<
 *             return self._make_comparable(other.real)
 *         else:
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Complex); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_other, __pyx_t_8); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __pyx_t_10 = (__pyx_t_1 != 0);
  if (__pyx_t_10) {
  } else {
    __pyx_t_2 = __pyx_t_10;
    goto __pyx_L12_bool_binop_done;
  }
  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_v_other, __pyx_n_s_imag); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_5 = PyObject_RichCompare(__pyx_t_8, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __pyx_t_10 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_10 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = __pyx_t_10;
  __pyx_L12_bool_binop_done:;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":509
 *             return (self, Decimal(other))
 *         if isinstance(other, numbers.Complex) and other.imag == 0:
 *             return self._make_comparable(other.real)             # <<<<<<<<<<<<<<
 *         else:
 *             raise TypeError
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_8 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_make_comparable); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_other, __pyx_n_s_real); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_8))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_8);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_8, function);
      }
    }
    if (!__pyx_t_6) {
      __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_7); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_5);
    } else {
      __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_11);
      PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
      PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_7);
      __pyx_t_7 = 0;
      __pyx_t_5 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_11, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 509; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    }
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":511
 *             return self._make_comparable(other.real)
 *         else:
 *             raise TypeError             # <<<<<<<<<<<<<<
 * 
 *     def __richcmp__(self, other, int op):
 */
    __Pyx_Raise(__pyx_builtin_TypeError, 0, 0, 0);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 511; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "_cdecimalfp.pyx":485
 * 
 *     # compare to Decimal or any type that can be converted to a Decimal
 *     def _make_comparable(self, other):             # <<<<<<<<<<<<<<
 *         cdef int selfPrec, otherPrec
 *         cdef Decimal dec
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_AddTraceback("_cdecimalfp.Decimal._make_comparable", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_num);
  __Pyx_XDECREF(__pyx_v_den);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":513
 *             raise TypeError
 * 
 *     def __richcmp__(self, other, int op):             # <<<<<<<<<<<<<<
 *         """Compare self and other using operator op."""
 *         try:
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_45__richcmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other, int __pyx_v_op); /*proto*/
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_45__richcmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other, int __pyx_v_op) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__richcmp__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_44__richcmp__(((PyObject *)__pyx_v_self), ((PyObject *)__pyx_v_other), ((int)__pyx_v_op));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_44__richcmp__(PyObject *__pyx_v_self, PyObject *__pyx_v_other, int __pyx_v_op) {
  PyObject *__pyx_v_selfVal = NULL;
  PyObject *__pyx_v_otherVal = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *(*__pyx_t_8)(PyObject *);
  int __pyx_t_9;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__richcmp__", 0);

  /* "_cdecimalfp.pyx":515
 *     def __richcmp__(self, other, int op):
 *         """Compare self and other using operator op."""
 *         try:             # <<<<<<<<<<<<<<
 *             selfVal, otherVal = self._make_comparable(other)
 *         except TypeError:
 */
  {
    __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3);
    __Pyx_XGOTREF(__pyx_t_1);
    __Pyx_XGOTREF(__pyx_t_2);
    __Pyx_XGOTREF(__pyx_t_3);
    /*try:*/ {

      /* "_cdecimalfp.pyx":516
 *         """Compare self and other using operator op."""
 *         try:
 *             selfVal, otherVal = self._make_comparable(other)             # <<<<<<<<<<<<<<
 *         except TypeError:
 *             return NotImplemented
 */
      __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_self, __pyx_n_s_make_comparable); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_6 = NULL;
      if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
        __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_5);
        if (likely(__pyx_t_6)) {
          PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
          __Pyx_INCREF(__pyx_t_6);
          __Pyx_INCREF(function);
          __Pyx_DECREF_SET(__pyx_t_5, function);
        }
      }
      if (!__pyx_t_6) {
        __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_v_other); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __Pyx_GOTREF(__pyx_t_4);
      } else {
        __pyx_t_7 = PyTuple_New(1+1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __Pyx_GOTREF(__pyx_t_7);
        PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
        __Pyx_INCREF(__pyx_v_other);
        PyTuple_SET_ITEM(__pyx_t_7, 0+1, __pyx_v_other);
        __Pyx_GIVEREF(__pyx_v_other);
        __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_7, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __Pyx_GOTREF(__pyx_t_4);
        __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      }
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
        PyObject* sequence = __pyx_t_4;
        #if CYTHON_COMPILING_IN_CPYTHON
        Py_ssize_t size = Py_SIZE(sequence);
        #else
        Py_ssize_t size = PySequence_Size(sequence);
        #endif
        if (unlikely(size != 2)) {
          if (size > 2) __Pyx_RaiseTooManyValuesError(2);
          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        #if CYTHON_COMPILING_IN_CPYTHON
        if (likely(PyTuple_CheckExact(sequence))) {
          __pyx_t_5 = PyTuple_GET_ITEM(sequence, 0); 
          __pyx_t_7 = PyTuple_GET_ITEM(sequence, 1); 
        } else {
          __pyx_t_5 = PyList_GET_ITEM(sequence, 0); 
          __pyx_t_7 = PyList_GET_ITEM(sequence, 1); 
        }
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_7);
        #else
        __pyx_t_5 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __Pyx_GOTREF(__pyx_t_5);
        __pyx_t_7 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __Pyx_GOTREF(__pyx_t_7);
        #endif
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      } else {
        Py_ssize_t index = -1;
        __pyx_t_6 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __Pyx_GOTREF(__pyx_t_6);
        __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
        __pyx_t_8 = Py_TYPE(__pyx_t_6)->tp_iternext;
        index = 0; __pyx_t_5 = __pyx_t_8(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L11_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_5);
        index = 1; __pyx_t_7 = __pyx_t_8(__pyx_t_6); if (unlikely(!__pyx_t_7)) goto __pyx_L11_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_7);
        if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_6), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __pyx_t_8 = NULL;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        goto __pyx_L12_unpacking_done;
        __pyx_L11_unpacking_failed:;
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_8 = NULL;
        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 516; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        __pyx_L12_unpacking_done:;
      }
      __pyx_v_selfVal = __pyx_t_5;
      __pyx_t_5 = 0;
      __pyx_v_otherVal = __pyx_t_7;
      __pyx_t_7 = 0;
    }
    __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_XDECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0;
    goto __pyx_L10_try_end;
    __pyx_L3_error:;
    __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0;

    /* "_cdecimalfp.pyx":517
 *         try:
 *             selfVal, otherVal = self._make_comparable(other)
 *         except TypeError:             # <<<<<<<<<<<<<<
 *             return NotImplemented
 *         return PyObject_RichCompare(selfVal, otherVal, op)
 */
    __pyx_t_9 = PyErr_ExceptionMatches(__pyx_builtin_TypeError);
    if (__pyx_t_9) {
      __Pyx_AddTraceback("_cdecimalfp.Decimal.__richcmp__", __pyx_clineno, __pyx_lineno, __pyx_filename);
      if (__Pyx_GetException(&__pyx_t_4, &__pyx_t_7, &__pyx_t_5) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 517; __pyx_clineno = __LINE__; goto __pyx_L5_except_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_GOTREF(__pyx_t_5);

      /* "_cdecimalfp.pyx":518
 *             selfVal, otherVal = self._make_comparable(other)
 *         except TypeError:
 *             return NotImplemented             # <<<<<<<<<<<<<<
 *         return PyObject_RichCompare(selfVal, otherVal, op)
 * 
 */
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(__pyx_builtin_NotImplemented);
      __pyx_r = __pyx_builtin_NotImplemented;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L6_except_return;
    }
    goto __pyx_L5_except_error;
    __pyx_L5_except_error:;
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L1_error;
    __pyx_L6_except_return:;
    __Pyx_XGIVEREF(__pyx_t_1);
    __Pyx_XGIVEREF(__pyx_t_2);
    __Pyx_XGIVEREF(__pyx_t_3);
    __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3);
    goto __pyx_L0;
    __pyx_L10_try_end:;
  }

  /* "_cdecimalfp.pyx":519
 *         except TypeError:
 *             return NotImplemented
 *         return PyObject_RichCompare(selfVal, otherVal, op)             # <<<<<<<<<<<<<<
 * 
 *     def __hash__(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_5 = PyObject_RichCompare(__pyx_v_selfVal, __pyx_v_otherVal, __pyx_v_op); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 519; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_r = __pyx_t_5;
  __pyx_t_5 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":513
 *             raise TypeError
 * 
 *     def __richcmp__(self, other, int op):             # <<<<<<<<<<<<<<
 *         """Compare self and other using operator op."""
 *         try:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__richcmp__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_selfVal);
  __Pyx_XDECREF(__pyx_v_otherVal);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":521
 *         return PyObject_RichCompare(selfVal, otherVal, op)
 * 
 *     def __hash__(self):             # <<<<<<<<<<<<<<
 *         """hash(self)"""
 *         cdef int sp
 */

/* Python wrapper */
static Py_hash_t __pyx_pw_11_cdecimalfp_7Decimal_47__hash__(PyObject *__pyx_v_self); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_46__hash__[] = "hash(self)";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_46__hash__;
#endif
static Py_hash_t __pyx_pw_11_cdecimalfp_7Decimal_47__hash__(PyObject *__pyx_v_self) {
  Py_hash_t __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__hash__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_46__hash__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static Py_hash_t __pyx_pf_11_cdecimalfp_7Decimal_46__hash__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  int __pyx_v_sp;
  PyObject *__pyx_v_sv = NULL;
  Py_hash_t __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  int __pyx_t_3;
  Py_hash_t __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  Py_ssize_t __pyx_t_8;
  PyObject *__pyx_t_9 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__hash__", 0);

  /* "_cdecimalfp.pyx":524
 *         """hash(self)"""
 *         cdef int sp
 *         sv, sp = self._value, self._precision             # <<<<<<<<<<<<<<
 *         if sp == 0:                         # if self == int(self),
 *             return hash(sv)                           # same hash as int
 */
  __pyx_t_1 = __pyx_v_self->_value;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = __pyx_v_self->_precision;
  __pyx_v_sv = __pyx_t_1;
  __pyx_t_1 = 0;
  __pyx_v_sp = __pyx_t_2;

  /* "_cdecimalfp.pyx":525
 *         cdef int sp
 *         sv, sp = self._value, self._precision
 *         if sp == 0:                         # if self == int(self),             # <<<<<<<<<<<<<<
 *             return hash(sv)                           # same hash as int
 *         else:                               # otherwise same hash as
 */
  __pyx_t_3 = ((__pyx_v_sp == 0) != 0);
  if (__pyx_t_3) {

    /* "_cdecimalfp.pyx":526
 *         sv, sp = self._value, self._precision
 *         if sp == 0:                         # if self == int(self),
 *             return hash(sv)                           # same hash as int             # <<<<<<<<<<<<<<
 *         else:                               # otherwise same hash as
 *             return hash(Fraction(sv, base10pow(sp)))  # equivalent fraction
 */
    __pyx_t_4 = PyObject_Hash(__pyx_v_sv); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 526; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_r = __pyx_t_4;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":528
 *             return hash(sv)                           # same hash as int
 *         else:                               # otherwise same hash as
 *             return hash(Fraction(sv, base10pow(sp)))  # equivalent fraction             # <<<<<<<<<<<<<<
 * 
 *     # return 0 or 1 for truth-value testing
 */
    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_Fraction); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_sp); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_7 = NULL;
    __pyx_t_8 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
        __pyx_t_8 = 1;
      }
    }
    __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_9);
    if (__pyx_t_7) {
      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
    }
    __Pyx_INCREF(__pyx_v_sv);
    PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_v_sv);
    __Pyx_GIVEREF(__pyx_v_sv);
    PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_4 = PyObject_Hash(__pyx_t_1); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 528; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_r = __pyx_t_4;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":521
 *         return PyObject_RichCompare(selfVal, otherVal, op)
 * 
 *     def __hash__(self):             # <<<<<<<<<<<<<<
 *         """hash(self)"""
 *         cdef int sp
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__hash__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_sv);
  if (unlikely(__pyx_r == -1) && !PyErr_Occurred()) __pyx_r = -2;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":531
 * 
 *     # return 0 or 1 for truth-value testing
 *     def __nonzero__(self):             # <<<<<<<<<<<<<<
 *         """bool(self)"""
 *         return self._value != 0
 */

/* Python wrapper */
static int __pyx_pw_11_cdecimalfp_7Decimal_49__nonzero__(PyObject *__pyx_v_self); /*proto*/
static int __pyx_pw_11_cdecimalfp_7Decimal_49__nonzero__(PyObject *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__nonzero__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_48__nonzero__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static int __pyx_pf_11_cdecimalfp_7Decimal_48__nonzero__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__nonzero__", 0);

  /* "_cdecimalfp.pyx":533
 *     def __nonzero__(self):
 *         """bool(self)"""
 *         return self._value != 0             # <<<<<<<<<<<<<<
 *     #__bool__ = __nonzero__
 * 
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_self->_value, __pyx_int_0, Py_NE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 533; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":531
 * 
 *     # return 0 or 1 for truth-value testing
 *     def __nonzero__(self):             # <<<<<<<<<<<<<<
 *         """bool(self)"""
 *         return self._value != 0
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__nonzero__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = -1;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":537
 * 
 *     # return integer portion as int
 *     def __int__(self):             # <<<<<<<<<<<<<<
 *         """math.trunc(self)"""
 *         return _int(self._value, self._precision)
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_51__int__(PyObject *__pyx_v_self); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_50__int__[] = "math.trunc(self)";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_50__int__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_51__int__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__int__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_50__int__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_50__int__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__int__", 0);

  /* "_cdecimalfp.pyx":539
 *     def __int__(self):
 *         """math.trunc(self)"""
 *         return _int(self._value, self._precision)             # <<<<<<<<<<<<<<
 *     #__trunc__ = __int__
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_v_self->_value;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = __pyx_f_11_cdecimalfp__int(__pyx_t_1, __pyx_v_self->_precision); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 539; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":537
 * 
 *     # return integer portion as int
 *     def __int__(self):             # <<<<<<<<<<<<<<
 *         """math.trunc(self)"""
 *         return _int(self._value, self._precision)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__int__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":543
 * 
 *     # convert to float (may loose precision!)
 *     def __float__(self):             # <<<<<<<<<<<<<<
 *         """float(self)"""
 *         return self._value / base10pow(self._precision)
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_53__float__(PyObject *__pyx_v_self); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_52__float__[] = "float(self)";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_52__float__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_53__float__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__float__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_52__float__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_52__float__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__float__", 0);

  /* "_cdecimalfp.pyx":545
 *     def __float__(self):
 *         """float(self)"""
 *         return self._value / base10pow(self._precision)             # <<<<<<<<<<<<<<
 * 
 *     def __pos__(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_self->_precision); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyNumber_Divide(__pyx_v_self->_value, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 545; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":543
 * 
 *     # convert to float (may loose precision!)
 *     def __float__(self):             # <<<<<<<<<<<<<<
 *         """float(self)"""
 *         return self._value / base10pow(self._precision)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__float__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":547
 *         return self._value / base10pow(self._precision)
 * 
 *     def __pos__(self):             # <<<<<<<<<<<<<<
 *         """+self"""
 *         return self
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_55__pos__(PyObject *__pyx_v_self); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_54__pos__[] = "+self";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_54__pos__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_55__pos__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pos__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_54__pos__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_54__pos__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pos__", 0);

  /* "_cdecimalfp.pyx":549
 *     def __pos__(self):
 *         """+self"""
 *         return self             # <<<<<<<<<<<<<<
 * 
 *     def __neg__(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  __pyx_r = ((PyObject *)__pyx_v_self);
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":547
 *         return self._value / base10pow(self._precision)
 * 
 *     def __pos__(self):             # <<<<<<<<<<<<<<
 *         """+self"""
 *         return self
 */

  /* function exit code */
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":551
 *         return self
 * 
 *     def __neg__(self):             # <<<<<<<<<<<<<<
 *         """-self"""
 *         cdef Decimal result
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_57__neg__(PyObject *__pyx_v_self); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_56__neg__[] = "-self";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_56__neg__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_57__neg__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__neg__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_56__neg__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_56__neg__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_result = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__neg__", 0);

  /* "_cdecimalfp.pyx":554
 *         """-self"""
 *         cdef Decimal result
 *         result = Decimal(self)             # <<<<<<<<<<<<<<
 *         result._value = -result._value
 *         return result
 */
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 554; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":555
 *         cdef Decimal result
 *         result = Decimal(self)
 *         result._value = -result._value             # <<<<<<<<<<<<<<
 *         return result
 * 
 */
  __pyx_t_2 = PyNumber_Negative(__pyx_v_result->_value); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 555; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __Pyx_GOTREF(__pyx_v_result->_value);
  __Pyx_DECREF(__pyx_v_result->_value);
  __pyx_v_result->_value = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":556
 *         result = Decimal(self)
 *         result._value = -result._value
 *         return result             # <<<<<<<<<<<<<<
 * 
 *     def __abs__(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_result));
  __pyx_r = ((PyObject *)__pyx_v_result);
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":551
 *         return self
 * 
 *     def __neg__(self):             # <<<<<<<<<<<<<<
 *         """-self"""
 *         cdef Decimal result
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__neg__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_result);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":558
 *         return result
 * 
 *     def __abs__(self):             # <<<<<<<<<<<<<<
 *         """abs(self)"""
 *         cdef Decimal result
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_59__abs__(PyObject *__pyx_v_self); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_58__abs__[] = "abs(self)";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_58__abs__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_59__abs__(PyObject *__pyx_v_self) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__abs__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_58__abs__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_58__abs__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_result = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__abs__", 0);

  /* "_cdecimalfp.pyx":561
 *         """abs(self)"""
 *         cdef Decimal result
 *         result = Decimal(self)             # <<<<<<<<<<<<<<
 *         result._value = abs(result._value)
 *         return result
 */
  __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(((PyObject *)__pyx_v_self));
  PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_v_self));
  __Pyx_GIVEREF(((PyObject *)__pyx_v_self));
  __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_1, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 561; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":562
 *         cdef Decimal result
 *         result = Decimal(self)
 *         result._value = abs(result._value)             # <<<<<<<<<<<<<<
 *         return result
 * 
 */
  __pyx_t_2 = __pyx_v_result->_value;
  __Pyx_INCREF(__pyx_t_2);
  __pyx_t_1 = PyNumber_Absolute(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 562; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_GIVEREF(__pyx_t_1);
  __Pyx_GOTREF(__pyx_v_result->_value);
  __Pyx_DECREF(__pyx_v_result->_value);
  __pyx_v_result->_value = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":563
 *         result = Decimal(self)
 *         result._value = abs(result._value)
 *         return result             # <<<<<<<<<<<<<<
 * 
 *     def __add__(x, y):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(((PyObject *)__pyx_v_result));
  __pyx_r = ((PyObject *)__pyx_v_result);
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":558
 *         return result
 * 
 *     def __abs__(self):             # <<<<<<<<<<<<<<
 *         """abs(self)"""
 *         cdef Decimal result
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__abs__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_result);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":565
 *         return result
 * 
 *     def __add__(x, y):             # <<<<<<<<<<<<<<
 *         """x + y"""
 *         if isinstance(x, Decimal):
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_61__add__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_60__add__[] = "x + y";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_60__add__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_61__add__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__add__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_60__add__(((PyObject *)__pyx_v_x), ((PyObject *)__pyx_v_y));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_60__add__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__add__", 0);

  /* "_cdecimalfp.pyx":567
 *     def __add__(x, y):
 *         """x + y"""
 *         if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *             return add(x, y)
 *         if isinstance(y, Decimal):
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":568
 *         """x + y"""
 *         if isinstance(x, Decimal):
 *             return add(x, y)             # <<<<<<<<<<<<<<
 *         if isinstance(y, Decimal):
 *             return add(y, x)
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_x) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_x, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_add(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 568; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":569
 *         if isinstance(x, Decimal):
 *             return add(x, y)
 *         if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *             return add(y, x)
 *         return NotImplemented
 */
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":570
 *             return add(x, y)
 *         if isinstance(y, Decimal):
 *             return add(y, x)             # <<<<<<<<<<<<<<
 *         return NotImplemented
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_y) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_y, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_add(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y), __pyx_v_x); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 570; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":571
 *         if isinstance(y, Decimal):
 *             return add(y, x)
 *         return NotImplemented             # <<<<<<<<<<<<<<
 * 
 *     def __sub__(x, y):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_builtin_NotImplemented);
  __pyx_r = __pyx_builtin_NotImplemented;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":565
 *         return result
 * 
 *     def __add__(x, y):             # <<<<<<<<<<<<<<
 *         """x + y"""
 *         if isinstance(x, Decimal):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__add__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":573
 *         return NotImplemented
 * 
 *     def __sub__(x, y):             # <<<<<<<<<<<<<<
 *         """x - y"""
 *         if isinstance(x, Decimal):
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_63__sub__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_62__sub__[] = "x - y";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_62__sub__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_63__sub__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__sub__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_62__sub__(((PyObject *)__pyx_v_x), ((PyObject *)__pyx_v_y));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_62__sub__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__sub__", 0);

  /* "_cdecimalfp.pyx":575
 *     def __sub__(x, y):
 *         """x - y"""
 *         if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *             return sub(x, y)
 *         if isinstance(y, Decimal):
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":576
 *         """x - y"""
 *         if isinstance(x, Decimal):
 *             return sub(x, y)             # <<<<<<<<<<<<<<
 *         if isinstance(y, Decimal):
 *             return add(-y, x)
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_x) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_x, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_sub(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 576; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":577
 *         if isinstance(x, Decimal):
 *             return sub(x, y)
 *         if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *             return add(-y, x)
 *         return NotImplemented
 */
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":578
 *             return sub(x, y)
 *         if isinstance(y, Decimal):
 *             return add(-y, x)             # <<<<<<<<<<<<<<
 *         return NotImplemented
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = PyNumber_Negative(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = __pyx_f_11_cdecimalfp_add(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_3), __pyx_v_x); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 578; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":579
 *         if isinstance(y, Decimal):
 *             return add(-y, x)
 *         return NotImplemented             # <<<<<<<<<<<<<<
 * 
 *     def __mul__(x, y):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_builtin_NotImplemented);
  __pyx_r = __pyx_builtin_NotImplemented;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":573
 *         return NotImplemented
 * 
 *     def __sub__(x, y):             # <<<<<<<<<<<<<<
 *         """x - y"""
 *         if isinstance(x, Decimal):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__sub__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":581
 *         return NotImplemented
 * 
 *     def __mul__(x, y):             # <<<<<<<<<<<<<<
 *         """x * y"""
 *         if isinstance(x, Decimal):
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_65__mul__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_64__mul__[] = "x * y";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_64__mul__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_65__mul__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__mul__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_64__mul__(((PyObject *)__pyx_v_x), ((PyObject *)__pyx_v_y));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_64__mul__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__mul__", 0);

  /* "_cdecimalfp.pyx":583
 *     def __mul__(x, y):
 *         """x * y"""
 *         if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *             return mul(x, y)
 *         if isinstance(y, Decimal):
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":584
 *         """x * y"""
 *         if isinstance(x, Decimal):
 *             return mul(x, y)             # <<<<<<<<<<<<<<
 *         if isinstance(y, Decimal):
 *             return mul(y, x)
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_x) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_x, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_mul(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 584; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":585
 *         if isinstance(x, Decimal):
 *             return mul(x, y)
 *         if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *             return mul(y, x)
 *         return NotImplemented
 */
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":586
 *             return mul(x, y)
 *         if isinstance(y, Decimal):
 *             return mul(y, x)             # <<<<<<<<<<<<<<
 *         return NotImplemented
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_y) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_y, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_mul(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y), __pyx_v_x); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 586; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":587
 *         if isinstance(y, Decimal):
 *             return mul(y, x)
 *         return NotImplemented             # <<<<<<<<<<<<<<
 * 
 *     def __div__(x, y):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_builtin_NotImplemented);
  __pyx_r = __pyx_builtin_NotImplemented;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":581
 *         return NotImplemented
 * 
 *     def __mul__(x, y):             # <<<<<<<<<<<<<<
 *         """x * y"""
 *         if isinstance(x, Decimal):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__mul__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":589
 *         return NotImplemented
 * 
 *     def __div__(x, y):             # <<<<<<<<<<<<<<
 *         """x / y"""
 *         if isinstance(x, Decimal):
 */

/* Python wrapper */
#if PY_MAJOR_VERSION < 3
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_67__div__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_66__div__[] = "x / y";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_66__div__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_67__div__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__div__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_66__div__(((PyObject *)__pyx_v_x), ((PyObject *)__pyx_v_y));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
#endif /*!(#if PY_MAJOR_VERSION < 3)*/

#if PY_MAJOR_VERSION < 3
static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_66__div__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__div__", 0);

  /* "_cdecimalfp.pyx":591
 *     def __div__(x, y):
 *         """x / y"""
 *         if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *             return div1(x, y)
 *         if isinstance(y, Decimal):
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":592
 *         """x / y"""
 *         if isinstance(x, Decimal):
 *             return div1(x, y)             # <<<<<<<<<<<<<<
 *         if isinstance(y, Decimal):
 *             return div2(x, y)
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_x) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_x, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_div1(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 592; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":593
 *         if isinstance(x, Decimal):
 *             return div1(x, y)
 *         if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *             return div2(x, y)
 *         return NotImplemented
 */
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":594
 *             return div1(x, y)
 *         if isinstance(y, Decimal):
 *             return div2(x, y)             # <<<<<<<<<<<<<<
 *         return NotImplemented
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_y) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_y, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_div2(__pyx_v_x, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 594; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":595
 *         if isinstance(y, Decimal):
 *             return div2(x, y)
 *         return NotImplemented             # <<<<<<<<<<<<<<
 * 
 *     # Decimal division is true division
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_builtin_NotImplemented);
  __pyx_r = __pyx_builtin_NotImplemented;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":589
 *         return NotImplemented
 * 
 *     def __div__(x, y):             # <<<<<<<<<<<<<<
 *         """x / y"""
 *         if isinstance(x, Decimal):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__div__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
#endif /*!(#if PY_MAJOR_VERSION < 3)*/

/* "_cdecimalfp.pyx":598
 * 
 *     # Decimal division is true division
 *     def __truediv__(x, y):             # <<<<<<<<<<<<<<
 *         """x / y"""
 *         if isinstance(x, Decimal):
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_69__truediv__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_68__truediv__[] = "x / y";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_68__truediv__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_69__truediv__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__truediv__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_68__truediv__(((PyObject *)__pyx_v_x), ((PyObject *)__pyx_v_y));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_68__truediv__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__truediv__", 0);

  /* "_cdecimalfp.pyx":600
 *     def __truediv__(x, y):
 *         """x / y"""
 *         if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *             return div1(x, y)
 *         if isinstance(y, Decimal):
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":601
 *         """x / y"""
 *         if isinstance(x, Decimal):
 *             return div1(x, y)             # <<<<<<<<<<<<<<
 *         if isinstance(y, Decimal):
 *             return div2(x, y)
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_x) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_x, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_div1(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 601; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":602
 *         if isinstance(x, Decimal):
 *             return div1(x, y)
 *         if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *             return div2(x, y)
 *         return NotImplemented
 */
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":603
 *             return div1(x, y)
 *         if isinstance(y, Decimal):
 *             return div2(x, y)             # <<<<<<<<<<<<<<
 *         return NotImplemented
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_y) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_y, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_div2(__pyx_v_x, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 603; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":604
 *         if isinstance(y, Decimal):
 *             return div2(x, y)
 *         return NotImplemented             # <<<<<<<<<<<<<<
 * 
 *     def __divmod__(x, y):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_builtin_NotImplemented);
  __pyx_r = __pyx_builtin_NotImplemented;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":598
 * 
 *     # Decimal division is true division
 *     def __truediv__(x, y):             # <<<<<<<<<<<<<<
 *         """x / y"""
 *         if isinstance(x, Decimal):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__truediv__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":606
 *         return NotImplemented
 * 
 *     def __divmod__(x, y):             # <<<<<<<<<<<<<<
 *         """x // y, x % y"""
 *         if isinstance(x, Decimal):
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_71__divmod__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_70__divmod__[] = "x // y, x % y";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_70__divmod__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_71__divmod__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__divmod__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_70__divmod__(((PyObject *)__pyx_v_x), ((PyObject *)__pyx_v_y));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_70__divmod__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__divmod__", 0);

  /* "_cdecimalfp.pyx":608
 *     def __divmod__(x, y):
 *         """x // y, x % y"""
 *         if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *             return divmod1(x, y)
 *         if isinstance(y, Decimal):
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":609
 *         """x // y, x % y"""
 *         if isinstance(x, Decimal):
 *             return divmod1(x, y)             # <<<<<<<<<<<<<<
 *         if isinstance(y, Decimal):
 *             return divmod2(x, y)
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_x) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_x, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_divmod1(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 609; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":610
 *         if isinstance(x, Decimal):
 *             return divmod1(x, y)
 *         if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *             return divmod2(x, y)
 *         return NotImplemented
 */
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":611
 *             return divmod1(x, y)
 *         if isinstance(y, Decimal):
 *             return divmod2(x, y)             # <<<<<<<<<<<<<<
 *         return NotImplemented
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_y) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_y, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_divmod2(__pyx_v_x, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 611; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":612
 *         if isinstance(y, Decimal):
 *             return divmod2(x, y)
 *         return NotImplemented             # <<<<<<<<<<<<<<
 * 
 *     def __floordiv__(x, y):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_builtin_NotImplemented);
  __pyx_r = __pyx_builtin_NotImplemented;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":606
 *         return NotImplemented
 * 
 *     def __divmod__(x, y):             # <<<<<<<<<<<<<<
 *         """x // y, x % y"""
 *         if isinstance(x, Decimal):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__divmod__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":614
 *         return NotImplemented
 * 
 *     def __floordiv__(x, y):             # <<<<<<<<<<<<<<
 *         """x // y"""
 *         if isinstance(x, Decimal):
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_73__floordiv__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_72__floordiv__[] = "x // y";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_72__floordiv__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_73__floordiv__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__floordiv__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_72__floordiv__(((PyObject *)__pyx_v_x), ((PyObject *)__pyx_v_y));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_72__floordiv__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__floordiv__", 0);

  /* "_cdecimalfp.pyx":616
 *     def __floordiv__(x, y):
 *         """x // y"""
 *         if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *             return floordiv1(x, y)
 *         if isinstance(y, Decimal):
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":617
 *         """x // y"""
 *         if isinstance(x, Decimal):
 *             return floordiv1(x, y)             # <<<<<<<<<<<<<<
 *         if isinstance(y, Decimal):
 *             return floordiv2(x, y)
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_x) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_x, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_floordiv1(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 617; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":618
 *         if isinstance(x, Decimal):
 *             return floordiv1(x, y)
 *         if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *             return floordiv2(x, y)
 *         return NotImplemented
 */
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":619
 *             return floordiv1(x, y)
 *         if isinstance(y, Decimal):
 *             return floordiv2(x, y)             # <<<<<<<<<<<<<<
 *         return NotImplemented
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_y) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_y, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_floordiv2(__pyx_v_x, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 619; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":620
 *         if isinstance(y, Decimal):
 *             return floordiv2(x, y)
 *         return NotImplemented             # <<<<<<<<<<<<<<
 * 
 *     def __mod__(x, y):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_builtin_NotImplemented);
  __pyx_r = __pyx_builtin_NotImplemented;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":614
 *         return NotImplemented
 * 
 *     def __floordiv__(x, y):             # <<<<<<<<<<<<<<
 *         """x // y"""
 *         if isinstance(x, Decimal):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__floordiv__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":622
 *         return NotImplemented
 * 
 *     def __mod__(x, y):             # <<<<<<<<<<<<<<
 *         """x % y"""
 *         if isinstance(x, Decimal):
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_75__mod__(PyObject *__pyx_v_x, PyObject *__pyx_v_y); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_74__mod__[] = "x % y";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_74__mod__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_75__mod__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__mod__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_74__mod__(((PyObject *)__pyx_v_x), ((PyObject *)__pyx_v_y));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_74__mod__(PyObject *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__mod__", 0);

  /* "_cdecimalfp.pyx":624
 *     def __mod__(x, y):
 *         """x % y"""
 *         if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *             return mod1(x, y)
 *         if isinstance(y, Decimal):
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":625
 *         """x % y"""
 *         if isinstance(x, Decimal):
 *             return mod1(x, y)             # <<<<<<<<<<<<<<
 *         if isinstance(y, Decimal):
 *             return mod2(x, y)
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_x) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_x, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_mod1(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 625; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":626
 *         if isinstance(x, Decimal):
 *             return mod1(x, y)
 *         if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *             return mod2(x, y)
 *         return NotImplemented
 */
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":627
 *             return mod1(x, y)
 *         if isinstance(y, Decimal):
 *             return mod2(x, y)             # <<<<<<<<<<<<<<
 *         return NotImplemented
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_y) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_y, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_mod2(__pyx_v_x, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 627; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":628
 *         if isinstance(y, Decimal):
 *             return mod2(x, y)
 *         return NotImplemented             # <<<<<<<<<<<<<<
 * 
 *     def __pow__(x, y, mod):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_builtin_NotImplemented);
  __pyx_r = __pyx_builtin_NotImplemented;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":622
 *         return NotImplemented
 * 
 *     def __mod__(x, y):             # <<<<<<<<<<<<<<
 *         """x % y"""
 *         if isinstance(x, Decimal):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__mod__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":630
 *         return NotImplemented
 * 
 *     def __pow__(x, y, mod):             # <<<<<<<<<<<<<<
 *         """x ** y
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_77__pow__(PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_mod); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_76__pow__[] = "x ** y\n\n        If y is an integer (or a Rational with denominator = 1), the\n        result will be a Decimal. Otherwise, the result will be a float or\n        complex since roots are generally irrational.\n\n        `mod` must always be None (otherwise a `TypeError` is raised).\n        ";
#if CYTHON_COMPILING_IN_CPYTHON
struct wrapperbase __pyx_wrapperbase_11_cdecimalfp_7Decimal_76__pow__;
#endif
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_77__pow__(PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_mod) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__pow__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_76__pow__(((PyObject *)__pyx_v_x), ((PyObject *)__pyx_v_y), ((PyObject *)__pyx_v_mod));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_76__pow__(PyObject *__pyx_v_x, PyObject *__pyx_v_y, PyObject *__pyx_v_mod) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__pow__", 0);

  /* "_cdecimalfp.pyx":639
 *         `mod` must always be None (otherwise a `TypeError` is raised).
 *         """
 *         if mod is not None:             # <<<<<<<<<<<<<<
 *             raise TypeError("3rd argument not allowed unless all arguments "
 *                             "are integers")
 */
  __pyx_t_1 = (__pyx_v_mod != Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":640
 *         """
 *         if mod is not None:
 *             raise TypeError("3rd argument not allowed unless all arguments "             # <<<<<<<<<<<<<<
 *                             "are integers")
 *         if isinstance(x, Decimal):
 */
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_Raise(__pyx_t_3, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "_cdecimalfp.pyx":642
 *             raise TypeError("3rd argument not allowed unless all arguments "
 *                             "are integers")
 *         if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *             return pow1(x, y)
 *         if isinstance(y, Decimal):
 */
  __pyx_t_2 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":643
 *                             "are integers")
 *         if isinstance(x, Decimal):
 *             return pow1(x, y)             # <<<<<<<<<<<<<<
 *         if isinstance(y, Decimal):
 *             return pow2(x, y)
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_x) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_x, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_pow1(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 643; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":644
 *         if isinstance(x, Decimal):
 *             return pow1(x, y)
 *         if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *             return pow2(x, y)
 *         return NotImplemented
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":645
 *             return pow1(x, y)
 *         if isinstance(y, Decimal):
 *             return pow2(x, y)             # <<<<<<<<<<<<<<
 *         return NotImplemented
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    if (!(likely(((__pyx_v_y) == Py_None) || likely(__Pyx_TypeTest(__pyx_v_y, __pyx_ptype_11_cdecimalfp_Decimal))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __pyx_f_11_cdecimalfp_pow2(__pyx_v_x, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 645; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":646
 *         if isinstance(y, Decimal):
 *             return pow2(x, y)
 *         return NotImplemented             # <<<<<<<<<<<<<<
 * 
 *     def __floor__(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __Pyx_INCREF(__pyx_builtin_NotImplemented);
  __pyx_r = __pyx_builtin_NotImplemented;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":630
 *         return NotImplemented
 * 
 *     def __pow__(x, y, mod):             # <<<<<<<<<<<<<<
 *         """x ** y
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__pow__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":648
 *         return NotImplemented
 * 
 *     def __floor__(self):             # <<<<<<<<<<<<<<
 *         """math.floor(self)"""
 *         n, d = self._value, base10pow(self._precision)
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_79__floor__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_78__floor__[] = "math.floor(self)";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_79__floor__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__floor__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_78__floor__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_78__floor__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_v_n = NULL;
  PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__floor__", 0);

  /* "_cdecimalfp.pyx":650
 *     def __floor__(self):
 *         """math.floor(self)"""
 *         n, d = self._value, base10pow(self._precision)             # <<<<<<<<<<<<<<
 *         return n // d
 * 
 */
  __pyx_t_1 = __pyx_v_self->_value;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_self->_precision); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 650; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_n = __pyx_t_1;
  __pyx_t_1 = 0;
  __pyx_v_d = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":651
 *         """math.floor(self)"""
 *         n, d = self._value, base10pow(self._precision)
 *         return n // d             # <<<<<<<<<<<<<<
 * 
 *     def __ceil__(self):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = PyNumber_FloorDivide(__pyx_v_n, __pyx_v_d); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 651; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":648
 *         return NotImplemented
 * 
 *     def __floor__(self):             # <<<<<<<<<<<<<<
 *         """math.floor(self)"""
 *         n, d = self._value, base10pow(self._precision)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__floor__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_n);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":653
 *         return n // d
 * 
 *     def __ceil__(self):             # <<<<<<<<<<<<<<
 *         """math.ceil(self)"""
 *         n, d = self._value, base10pow(self._precision)
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_81__ceil__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_80__ceil__[] = "math.ceil(self)";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_81__ceil__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__ceil__ (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_80__ceil__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_80__ceil__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self) {
  PyObject *__pyx_v_n = NULL;
  PyObject *__pyx_v_d = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__ceil__", 0);

  /* "_cdecimalfp.pyx":655
 *     def __ceil__(self):
 *         """math.ceil(self)"""
 *         n, d = self._value, base10pow(self._precision)             # <<<<<<<<<<<<<<
 *         return -(-n // d)
 * 
 */
  __pyx_t_1 = __pyx_v_self->_value;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_self->_precision); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 655; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_n = __pyx_t_1;
  __pyx_t_1 = 0;
  __pyx_v_d = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":656
 *         """math.ceil(self)"""
 *         n, d = self._value, base10pow(self._precision)
 *         return -(-n // d)             # <<<<<<<<<<<<<<
 * 
 *     def __round__(self, precision=None):
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = PyNumber_Negative(__pyx_v_n); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = PyNumber_FloorDivide(__pyx_t_2, __pyx_v_d); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Negative(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 656; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":653
 *         return n // d
 * 
 *     def __ceil__(self):             # <<<<<<<<<<<<<<
 *         """math.ceil(self)"""
 *         n, d = self._value, base10pow(self._precision)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__ceil__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_n);
  __Pyx_XDECREF(__pyx_v_d);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":658
 *         return -(-n // d)
 * 
 *     def __round__(self, precision=None):             # <<<<<<<<<<<<<<
 *         """round(self [, ndigits])
 * 
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_83__round__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static char __pyx_doc_11_cdecimalfp_7Decimal_82__round__[] = "round(self [, ndigits])\n\n        Round `self` to a given precision in decimal digits (default 0).\n        `ndigits` may be negative.\n\n        Note: This method is called by the built-in `round` function only in\n        Python 3.x! It returns an `int` when called with one argument,\n        otherwise a :class:`Decimal`.\n        ";
static PyObject *__pyx_pw_11_cdecimalfp_7Decimal_83__round__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_precision = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__round__ (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_precision,0};
    PyObject* values[1] = {0};
    values[0] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_precision);
          if (value) { values[0] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__round__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_precision = values[0];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("__round__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 658; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__round__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_11_cdecimalfp_7Decimal_82__round__(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_self), __pyx_v_precision);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_7Decimal_82__round__(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_self, PyObject *__pyx_v_precision) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  Py_ssize_t __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("__round__", 0);

  /* "_cdecimalfp.pyx":668
 *         otherwise a :class:`Decimal`.
 *         """
 *         if precision is None:             # <<<<<<<<<<<<<<
 *             # return integer
 *             return int(self.adjusted(0, DFLT_ROUNDING))
 */
  __pyx_t_1 = (__pyx_v_precision == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":670
 *         if precision is None:
 *             # return integer
 *             return int(self.adjusted(0, DFLT_ROUNDING))             # <<<<<<<<<<<<<<
 *         # otherwise return Decimal
 *         return self.adjusted(precision, DFLT_ROUNDING)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_adjusted); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_DFLT_ROUNDING); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = NULL;
    __pyx_t_7 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
        __pyx_t_7 = 1;
      }
    }
    __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    if (__pyx_t_6) {
      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
    }
    __Pyx_INCREF(__pyx_int_0);
    PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_int_0);
    __Pyx_GIVEREF(__pyx_int_0);
    PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_8, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = PyNumber_Int(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 670; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":672
 *             return int(self.adjusted(0, DFLT_ROUNDING))
 *         # otherwise return Decimal
 *         return self.adjusted(precision, DFLT_ROUNDING)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_self), __pyx_n_s_adjusted); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_8 = __Pyx_GetModuleGlobalName(__pyx_n_s_DFLT_ROUNDING); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_t_5 = NULL;
  __pyx_t_7 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_3);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_3, function);
      __pyx_t_7 = 1;
    }
  }
  __pyx_t_6 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  if (__pyx_t_5) {
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
  }
  __Pyx_INCREF(__pyx_v_precision);
  PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_7, __pyx_v_precision);
  __Pyx_GIVEREF(__pyx_v_precision);
  PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_7, __pyx_t_8);
  __Pyx_GIVEREF(__pyx_t_8);
  __pyx_t_8 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 672; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":658
 *         return -(-n // d)
 * 
 *     def __round__(self, precision=None):             # <<<<<<<<<<<<<<
 *         """round(self [, ndigits])
 * 
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("_cdecimalfp.Decimal.__round__", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":683
 * 
 * # 10 ** exp as PyLong
 * cdef object base10pow(int exp):             # <<<<<<<<<<<<<<
 *     if 0 <= exp < LLONG_MAX_LOG10:
 *         return PyLong_FromLongLong(10 ** exp)
 */

static PyObject *__pyx_f_11_cdecimalfp_base10pow(int __pyx_v_exp) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("base10pow", 0);

  /* "_cdecimalfp.pyx":684
 * # 10 ** exp as PyLong
 * cdef object base10pow(int exp):
 *     if 0 <= exp < LLONG_MAX_LOG10:             # <<<<<<<<<<<<<<
 *         return PyLong_FromLongLong(10 ** exp)
 *     return PyNumber_Power(PYLONG_10, exp, None)
 */
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_exp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyObject_RichCompare(__pyx_int_0, __pyx_t_1, Py_LE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__Pyx_PyObject_IsTrue(__pyx_t_2)) {
    __Pyx_DECREF(__pyx_t_2);
    __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_v_11_cdecimalfp_LLONG_MAX_LOG10, Py_LT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 684; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_3) {

    /* "_cdecimalfp.pyx":685
 * cdef object base10pow(int exp):
 *     if 0 <= exp < LLONG_MAX_LOG10:
 *         return PyLong_FromLongLong(10 ** exp)             # <<<<<<<<<<<<<<
 *     return PyNumber_Power(PYLONG_10, exp, None)
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = PyLong_FromLongLong(__Pyx_pow_long(10, ((long)__pyx_v_exp))); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 685; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":686
 *     if 0 <= exp < LLONG_MAX_LOG10:
 *         return PyLong_FromLongLong(10 ** exp)
 *     return PyNumber_Power(PYLONG_10, exp, None)             # <<<<<<<<<<<<<<
 * 
 * # parse string
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __pyx_v_11_cdecimalfp_PYLONG_10;
  __Pyx_INCREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_exp); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = PyNumber_Power(__pyx_t_2, __pyx_t_1, Py_None); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 686; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_4;
  __pyx_t_4 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":683
 * 
 * # 10 ** exp as PyLong
 * cdef object base10pow(int exp):             # <<<<<<<<<<<<<<
 *     if 0 <= exp < LLONG_MAX_LOG10:
 *         return PyLong_FromLongLong(10 ** exp)
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("_cdecimalfp.base10pow", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":703
 * _parseString = re.compile(_pattern, re.VERBOSE).match
 * 
 * cdef void _dec_from_str(Decimal dec, bytes s, int prec) except *:             # <<<<<<<<<<<<<<
 *     cdef bytes sExp, sInt, sFrac
 *     cdef object nInt, nFrac, coeff, parsed
 */

static void __pyx_f_11_cdecimalfp__dec_from_str(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_dec, PyObject *__pyx_v_s, int __pyx_v_prec) {
  PyObject *__pyx_v_sExp = 0;
  PyObject *__pyx_v_sInt = 0;
  PyObject *__pyx_v_sFrac = 0;
  PyObject *__pyx_v_nInt = 0;
  PyObject *__pyx_v_nFrac = 0;
  PyObject *__pyx_v_coeff = 0;
  PyObject *__pyx_v_parsed = 0;
  int __pyx_v_exp;
  int __pyx_v_shift10;
  char *__pyx_v_pend;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  int __pyx_t_6;
  char const *__pyx_t_7;
  char *__pyx_t_8;
  Py_ssize_t __pyx_t_9;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_dec_from_str", 0);

  /* "_cdecimalfp.pyx":708
 *     cdef int exp, shift10
 *     cdef char *pend
 *     parsed = _parseString(s)             # <<<<<<<<<<<<<<
 *     if parsed is None:
 *         raise ValueError
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_parseString); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_s); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(__pyx_v_s);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_s);
    __Pyx_GIVEREF(__pyx_v_s);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 708; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_parsed = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":709
 *     cdef char *pend
 *     parsed = _parseString(s)
 *     if parsed is None:             # <<<<<<<<<<<<<<
 *         raise ValueError
 *     sExp = parsed.group('exp')
 */
  __pyx_t_5 = (__pyx_v_parsed == Py_None);
  __pyx_t_6 = (__pyx_t_5 != 0);
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":710
 *     parsed = _parseString(s)
 *     if parsed is None:
 *         raise ValueError             # <<<<<<<<<<<<<<
 *     sExp = parsed.group('exp')
 *     if sExp:
 */
    __Pyx_Raise(__pyx_builtin_ValueError, 0, 0, 0);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 710; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "_cdecimalfp.pyx":711
 *     if parsed is None:
 *         raise ValueError
 *     sExp = parsed.group('exp')             # <<<<<<<<<<<<<<
 *     if sExp:
 *         exp = atoi(sExp)
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_parsed, __pyx_n_s_group); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (!(likely(PyBytes_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_sExp = ((PyObject*)__pyx_t_2);
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":712
 *         raise ValueError
 *     sExp = parsed.group('exp')
 *     if sExp:             # <<<<<<<<<<<<<<
 *         exp = atoi(sExp)
 *     else:
 */
  __pyx_t_6 = (__pyx_v_sExp != Py_None) && (PyBytes_GET_SIZE(__pyx_v_sExp) != 0);
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":713
 *     sExp = parsed.group('exp')
 *     if sExp:
 *         exp = atoi(sExp)             # <<<<<<<<<<<<<<
 *     else:
 *         exp = 0
 */
    __pyx_t_7 = __Pyx_PyObject_AsString(__pyx_v_sExp); if (unlikely((!__pyx_t_7) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 713; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_exp = atoi(__pyx_t_7);
    goto __pyx_L4;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":715
 *         exp = atoi(sExp)
 *     else:
 *         exp = 0             # <<<<<<<<<<<<<<
 *     sInt = parsed.group('int')
 *     if sInt:
 */
    __pyx_v_exp = 0;
  }
  __pyx_L4:;

  /* "_cdecimalfp.pyx":716
 *     else:
 *         exp = 0
 *     sInt = parsed.group('int')             # <<<<<<<<<<<<<<
 *     if sInt:
 *         nInt = PyLong_FromString(sInt, &pend, 10)
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_parsed, __pyx_n_s_group); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (!(likely(PyBytes_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_sInt = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":717
 *         exp = 0
 *     sInt = parsed.group('int')
 *     if sInt:             # <<<<<<<<<<<<<<
 *         nInt = PyLong_FromString(sInt, &pend, 10)
 *         sFrac = parsed.group('frac')
 */
  __pyx_t_6 = (__pyx_v_sInt != Py_None) && (PyBytes_GET_SIZE(__pyx_v_sInt) != 0);
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":718
 *     sInt = parsed.group('int')
 *     if sInt:
 *         nInt = PyLong_FromString(sInt, &pend, 10)             # <<<<<<<<<<<<<<
 *         sFrac = parsed.group('frac')
 *     else:
 */
    __pyx_t_8 = __Pyx_PyObject_AsString(__pyx_v_sInt); if (unlikely((!__pyx_t_8) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_1 = PyLong_FromString(__pyx_t_8, (&__pyx_v_pend), 10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 718; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_nInt = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":719
 *     if sInt:
 *         nInt = PyLong_FromString(sInt, &pend, 10)
 *         sFrac = parsed.group('frac')             # <<<<<<<<<<<<<<
 *     else:
 *         nInt = PyLong_FromLong(0)
 */
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_parsed, __pyx_n_s_group); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (!(likely(PyBytes_CheckExact(__pyx_t_2))||((__pyx_t_2) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_2)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_sFrac = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;
    goto __pyx_L5;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":721
 *         sFrac = parsed.group('frac')
 *     else:
 *         nInt = PyLong_FromLong(0)             # <<<<<<<<<<<<<<
 *         sFrac = parsed.group('onlyfrac')
 *     if sFrac:
 */
    __pyx_t_2 = PyLong_FromLong(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 721; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_v_nInt = __pyx_t_2;
    __pyx_t_2 = 0;

    /* "_cdecimalfp.pyx":722
 *     else:
 *         nInt = PyLong_FromLong(0)
 *         sFrac = parsed.group('onlyfrac')             # <<<<<<<<<<<<<<
 *     if sFrac:
 *         nFrac = PyLong_FromString(sFrac, &pend, 10)
 */
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_parsed, __pyx_n_s_group); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__13, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (!(likely(PyBytes_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytes", Py_TYPE(__pyx_t_1)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_sFrac = ((PyObject*)__pyx_t_1);
    __pyx_t_1 = 0;
  }
  __pyx_L5:;

  /* "_cdecimalfp.pyx":723
 *         nInt = PyLong_FromLong(0)
 *         sFrac = parsed.group('onlyfrac')
 *     if sFrac:             # <<<<<<<<<<<<<<
 *         nFrac = PyLong_FromString(sFrac, &pend, 10)
 *         shift10 = len(sFrac)
 */
  __pyx_t_6 = (__pyx_v_sFrac != Py_None) && (PyBytes_GET_SIZE(__pyx_v_sFrac) != 0);
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":724
 *         sFrac = parsed.group('onlyfrac')
 *     if sFrac:
 *         nFrac = PyLong_FromString(sFrac, &pend, 10)             # <<<<<<<<<<<<<<
 *         shift10 = len(sFrac)
 *     else:
 */
    __pyx_t_8 = __Pyx_PyObject_AsString(__pyx_v_sFrac); if (unlikely((!__pyx_t_8) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 724; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_1 = PyLong_FromString(__pyx_t_8, (&__pyx_v_pend), 10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 724; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_nFrac = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":725
 *     if sFrac:
 *         nFrac = PyLong_FromString(sFrac, &pend, 10)
 *         shift10 = len(sFrac)             # <<<<<<<<<<<<<<
 *     else:
 *         nFrac = PyLong_FromLong(0)
 */
    if (unlikely(__pyx_v_sFrac == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()");
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 725; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_9 = PyBytes_GET_SIZE(__pyx_v_sFrac); if (unlikely(__pyx_t_9 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 725; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_shift10 = __pyx_t_9;
    goto __pyx_L6;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":727
 *         shift10 = len(sFrac)
 *     else:
 *         nFrac = PyLong_FromLong(0)             # <<<<<<<<<<<<<<
 *         shift10 = 0
 *     coeff = nInt * base10pow(shift10) + nFrac
 */
    __pyx_t_1 = PyLong_FromLong(0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 727; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_nFrac = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":728
 *     else:
 *         nFrac = PyLong_FromLong(0)
 *         shift10 = 0             # <<<<<<<<<<<<<<
 *     coeff = nInt * base10pow(shift10) + nFrac
 *     exp -= shift10
 */
    __pyx_v_shift10 = 0;
  }
  __pyx_L6:;

  /* "_cdecimalfp.pyx":729
 *         nFrac = PyLong_FromLong(0)
 *         shift10 = 0
 *     coeff = nInt * base10pow(shift10) + nFrac             # <<<<<<<<<<<<<<
 *     exp -= shift10
 *     if parsed.group('sign') == b'-':
 */
  __pyx_t_1 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_shift10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 729; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Multiply(__pyx_v_nInt, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 729; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyNumber_Add(__pyx_t_2, __pyx_v_nFrac); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 729; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_coeff = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":730
 *         shift10 = 0
 *     coeff = nInt * base10pow(shift10) + nFrac
 *     exp -= shift10             # <<<<<<<<<<<<<<
 *     if parsed.group('sign') == b'-':
 *         coeff = -coeff
 */
  __pyx_v_exp = (__pyx_v_exp - __pyx_v_shift10);

  /* "_cdecimalfp.pyx":731
 *     coeff = nInt * base10pow(shift10) + nFrac
 *     exp -= shift10
 *     if parsed.group('sign') == b'-':             # <<<<<<<<<<<<<<
 *         coeff = -coeff
 *     _dec_from_coeff_exp(dec, coeff, exp, prec)
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_parsed, __pyx_n_s_group); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__14, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_6 = (__Pyx_PyBytes_Equals(__pyx_t_2, __pyx_kp_b__4, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":732
 *     exp -= shift10
 *     if parsed.group('sign') == b'-':
 *         coeff = -coeff             # <<<<<<<<<<<<<<
 *     _dec_from_coeff_exp(dec, coeff, exp, prec)
 * 
 */
    __pyx_t_2 = PyNumber_Negative(__pyx_v_coeff); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 732; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF_SET(__pyx_v_coeff, __pyx_t_2);
    __pyx_t_2 = 0;
    goto __pyx_L7;
  }
  __pyx_L7:;

  /* "_cdecimalfp.pyx":733
 *     if parsed.group('sign') == b'-':
 *         coeff = -coeff
 *     _dec_from_coeff_exp(dec, coeff, exp, prec)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_f_11_cdecimalfp__dec_from_coeff_exp(__pyx_v_dec, __pyx_v_coeff, __pyx_v_exp, __pyx_v_prec); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 733; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":703
 * _parseString = re.compile(_pattern, re.VERBOSE).match
 * 
 * cdef void _dec_from_str(Decimal dec, bytes s, int prec) except *:             # <<<<<<<<<<<<<<
 *     cdef bytes sExp, sInt, sFrac
 *     cdef object nInt, nFrac, coeff, parsed
 */

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("_cdecimalfp._dec_from_str", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_sExp);
  __Pyx_XDECREF(__pyx_v_sInt);
  __Pyx_XDECREF(__pyx_v_sFrac);
  __Pyx_XDECREF(__pyx_v_nInt);
  __Pyx_XDECREF(__pyx_v_nFrac);
  __Pyx_XDECREF(__pyx_v_coeff);
  __Pyx_XDECREF(__pyx_v_parsed);
  __Pyx_RefNannyFinishContext();
}

/* "_cdecimalfp.pyx":736
 * 
 * 
 * cdef void _dec_from_coeff_exp(Decimal dec, object coeff, int exp,             # <<<<<<<<<<<<<<
 *                               int prec) except *:
 *     """Set `dec` so that it equals coeff * 10 ** exp, rounded to precision
 */

static void __pyx_f_11_cdecimalfp__dec_from_coeff_exp(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_dec, PyObject *__pyx_v_coeff, int __pyx_v_exp, int __pyx_v_prec) {
  int __pyx_v_shift10;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  unsigned int __pyx_t_4;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_dec_from_coeff_exp", 0);

  /* "_cdecimalfp.pyx":741
 *     `prec`."""
 *     cdef int shift10
 *     if prec == -1:             # <<<<<<<<<<<<<<
 *         if exp > 0:
 *             dec._precision = 0
 */
  __pyx_t_1 = ((__pyx_v_prec == -1) != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":742
 *     cdef int shift10
 *     if prec == -1:
 *         if exp > 0:             # <<<<<<<<<<<<<<
 *             dec._precision = 0
 *             dec._value = coeff * base10pow(exp)
 */
    __pyx_t_1 = ((__pyx_v_exp > 0) != 0);
    if (__pyx_t_1) {

      /* "_cdecimalfp.pyx":743
 *     if prec == -1:
 *         if exp > 0:
 *             dec._precision = 0             # <<<<<<<<<<<<<<
 *             dec._value = coeff * base10pow(exp)
 *         else:
 */
      __pyx_v_dec->_precision = 0;

      /* "_cdecimalfp.pyx":744
 *         if exp > 0:
 *             dec._precision = 0
 *             dec._value = coeff * base10pow(exp)             # <<<<<<<<<<<<<<
 *         else:
 *             dec._precision = abs(exp)
 */
      __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_exp); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_3 = PyNumber_Multiply(__pyx_v_coeff, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 744; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GIVEREF(__pyx_t_3);
      __Pyx_GOTREF(__pyx_v_dec->_value);
      __Pyx_DECREF(__pyx_v_dec->_value);
      __pyx_v_dec->_value = __pyx_t_3;
      __pyx_t_3 = 0;
      goto __pyx_L4;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":746
 *             dec._value = coeff * base10pow(exp)
 *         else:
 *             dec._precision = abs(exp)             # <<<<<<<<<<<<<<
 *             dec._value = coeff
 *     else:
 */
      __pyx_t_4 = __Pyx_abs_int(__pyx_v_exp); 
      __pyx_v_dec->_precision = __pyx_t_4;

      /* "_cdecimalfp.pyx":747
 *         else:
 *             dec._precision = abs(exp)
 *             dec._value = coeff             # <<<<<<<<<<<<<<
 *     else:
 *         dec._precision = prec
 */
      __Pyx_INCREF(__pyx_v_coeff);
      __Pyx_GIVEREF(__pyx_v_coeff);
      __Pyx_GOTREF(__pyx_v_dec->_value);
      __Pyx_DECREF(__pyx_v_dec->_value);
      __pyx_v_dec->_value = __pyx_v_coeff;
    }
    __pyx_L4:;
    goto __pyx_L3;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":749
 *             dec._value = coeff
 *     else:
 *         dec._precision = prec             # <<<<<<<<<<<<<<
 *         shift10 = exp + prec
 *         if shift10 == 0:
 */
    __pyx_v_dec->_precision = __pyx_v_prec;

    /* "_cdecimalfp.pyx":750
 *     else:
 *         dec._precision = prec
 *         shift10 = exp + prec             # <<<<<<<<<<<<<<
 *         if shift10 == 0:
 *             dec._value = coeff
 */
    __pyx_v_shift10 = (__pyx_v_exp + __pyx_v_prec);

    /* "_cdecimalfp.pyx":751
 *         dec._precision = prec
 *         shift10 = exp + prec
 *         if shift10 == 0:             # <<<<<<<<<<<<<<
 *             dec._value = coeff
 *         if shift10 > 0:
 */
    __pyx_t_1 = ((__pyx_v_shift10 == 0) != 0);
    if (__pyx_t_1) {

      /* "_cdecimalfp.pyx":752
 *         shift10 = exp + prec
 *         if shift10 == 0:
 *             dec._value = coeff             # <<<<<<<<<<<<<<
 *         if shift10 > 0:
 *             dec._value = coeff * base10pow(shift10)
 */
      __Pyx_INCREF(__pyx_v_coeff);
      __Pyx_GIVEREF(__pyx_v_coeff);
      __Pyx_GOTREF(__pyx_v_dec->_value);
      __Pyx_DECREF(__pyx_v_dec->_value);
      __pyx_v_dec->_value = __pyx_v_coeff;
      goto __pyx_L5;
    }
    __pyx_L5:;

    /* "_cdecimalfp.pyx":753
 *         if shift10 == 0:
 *             dec._value = coeff
 *         if shift10 > 0:             # <<<<<<<<<<<<<<
 *             dec._value = coeff * base10pow(shift10)
 *         else:
 */
    __pyx_t_1 = ((__pyx_v_shift10 > 0) != 0);
    if (__pyx_t_1) {

      /* "_cdecimalfp.pyx":754
 *             dec._value = coeff
 *         if shift10 > 0:
 *             dec._value = coeff * base10pow(shift10)             # <<<<<<<<<<<<<<
 *         else:
 *             dec._value = _div_rounded(coeff, base10pow(-shift10))
 */
      __pyx_t_3 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_shift10); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 754; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_2 = PyNumber_Multiply(__pyx_v_coeff, __pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 754; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_GIVEREF(__pyx_t_2);
      __Pyx_GOTREF(__pyx_v_dec->_value);
      __Pyx_DECREF(__pyx_v_dec->_value);
      __pyx_v_dec->_value = __pyx_t_2;
      __pyx_t_2 = 0;
      goto __pyx_L6;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":756
 *             dec._value = coeff * base10pow(shift10)
 *         else:
 *             dec._value = _div_rounded(coeff, base10pow(-shift10))             # <<<<<<<<<<<<<<
 * 
 * 
 */
      __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_shift10)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 756; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_3 = __pyx_f_11_cdecimalfp__div_rounded(__pyx_v_coeff, __pyx_t_2, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 756; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GIVEREF(__pyx_t_3);
      __Pyx_GOTREF(__pyx_v_dec->_value);
      __Pyx_DECREF(__pyx_v_dec->_value);
      __pyx_v_dec->_value = __pyx_t_3;
      __pyx_t_3 = 0;
    }
    __pyx_L6:;
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":736
 * 
 * 
 * cdef void _dec_from_coeff_exp(Decimal dec, object coeff, int exp,             # <<<<<<<<<<<<<<
 *                               int prec) except *:
 *     """Set `dec` so that it equals coeff * 10 ** exp, rounded to precision
 */

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp._dec_from_coeff_exp", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}

/* "_cdecimalfp.pyx":759
 * 
 * 
 * cdef void _dec_from_rational(Decimal dec, object num, object den,             # <<<<<<<<<<<<<<
 *                              int prec) except *:
 *     if prec >= 0:
 */

static void __pyx_f_11_cdecimalfp__dec_from_rational(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_dec, PyObject *__pyx_v_num, PyObject *__pyx_v_den, int __pyx_v_prec) {
  int __pyx_v_rem;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_dec_from_rational", 0);

  /* "_cdecimalfp.pyx":761
 * cdef void _dec_from_rational(Decimal dec, object num, object den,
 *                              int prec) except *:
 *     if prec >= 0:             # <<<<<<<<<<<<<<
 *         dec._value = _div_rounded(num * base10pow(prec), den)
 *         dec._precision = prec
 */
  __pyx_t_1 = ((__pyx_v_prec >= 0) != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":762
 *                              int prec) except *:
 *     if prec >= 0:
 *         dec._value = _div_rounded(num * base10pow(prec), den)             # <<<<<<<<<<<<<<
 *         dec._precision = prec
 *     else:
 */
    __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_prec); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PyNumber_Multiply(__pyx_v_num, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __pyx_f_11_cdecimalfp__div_rounded(__pyx_t_3, __pyx_v_den, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 762; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GIVEREF(__pyx_t_2);
    __Pyx_GOTREF(__pyx_v_dec->_value);
    __Pyx_DECREF(__pyx_v_dec->_value);
    __pyx_v_dec->_value = __pyx_t_2;
    __pyx_t_2 = 0;

    /* "_cdecimalfp.pyx":763
 *     if prec >= 0:
 *         dec._value = _div_rounded(num * base10pow(prec), den)
 *         dec._precision = prec             # <<<<<<<<<<<<<<
 *     else:
 *         rem = _approx_rational(dec, num, den)
 */
    __pyx_v_dec->_precision = __pyx_v_prec;
    goto __pyx_L3;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":765
 *         dec._precision = prec
 *     else:
 *         rem = _approx_rational(dec, num, den)             # <<<<<<<<<<<<<<
 *         if rem:
 *             raise ValueError
 */
    __pyx_t_1 = __pyx_f_11_cdecimalfp__approx_rational(__pyx_v_dec, __pyx_v_num, __pyx_v_den, NULL); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 765; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_v_rem = __pyx_t_1;

    /* "_cdecimalfp.pyx":766
 *     else:
 *         rem = _approx_rational(dec, num, den)
 *         if rem:             # <<<<<<<<<<<<<<
 *             raise ValueError
 * 
 */
    __pyx_t_1 = (__pyx_v_rem != 0);
    if (__pyx_t_1) {

      /* "_cdecimalfp.pyx":767
 *         rem = _approx_rational(dec, num, den)
 *         if rem:
 *             raise ValueError             # <<<<<<<<<<<<<<
 * 
 * 
 */
      __Pyx_Raise(__pyx_builtin_ValueError, 0, 0, 0);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 767; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":759
 * 
 * 
 * cdef void _dec_from_rational(Decimal dec, object num, object den,             # <<<<<<<<<<<<<<
 *                              int prec) except *:
 *     if prec >= 0:
 */

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp._dec_from_rational", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}

/* "_cdecimalfp.pyx":770
 * 
 * 
 * cdef bint _approx_rational(Decimal dec, object num, object den,             # <<<<<<<<<<<<<<
 *                            int minPrec=0) except *:
 *     """Approximate num / den as Decimal.
 */

static int __pyx_f_11_cdecimalfp__approx_rational(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_dec, PyObject *__pyx_v_num, PyObject *__pyx_v_den, struct __pyx_opt_args_11_cdecimalfp__approx_rational *__pyx_optional_args) {
  int __pyx_v_minPrec = ((int)0);
  int __pyx_v_maxPrec;
  int __pyx_v_prec;
  PyObject *__pyx_v_quot = NULL;
  PyObject *__pyx_v_rem = NULL;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_t_6;
  PyObject *(*__pyx_t_7)(PyObject *);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_approx_rational", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_minPrec = __pyx_optional_args->minPrec;
    }
  }

  /* "_cdecimalfp.pyx":780
 *     """
 *     cdef int maxPrec, prec
 *     maxPrec = max(minPrec, _get_limit_prec())             # <<<<<<<<<<<<<<
 *     while True:
 *         prec = (minPrec + maxPrec) // 2
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_limit_prec); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  } else {
    __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = __pyx_v_minPrec;
  __pyx_t_3 = __Pyx_PyInt_From_int(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_5 = PyObject_RichCompare(__pyx_t_1, __pyx_t_3, Py_GT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  if (__pyx_t_6) {
    __Pyx_INCREF(__pyx_t_1);
    __pyx_t_2 = __pyx_t_1;
  } else {
    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_t_4); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_2 = __pyx_t_5;
    __pyx_t_5 = 0;
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_4 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 780; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_maxPrec = __pyx_t_4;

  /* "_cdecimalfp.pyx":781
 *     cdef int maxPrec, prec
 *     maxPrec = max(minPrec, _get_limit_prec())
 *     while True:             # <<<<<<<<<<<<<<
 *         prec = (minPrec + maxPrec) // 2
 *         quot, rem = divmod(num * base10pow(prec), den)
 */
  while (1) {

    /* "_cdecimalfp.pyx":782
 *     maxPrec = max(minPrec, _get_limit_prec())
 *     while True:
 *         prec = (minPrec + maxPrec) // 2             # <<<<<<<<<<<<<<
 *         quot, rem = divmod(num * base10pow(prec), den)
 *         if prec == maxPrec:
 */
    __pyx_v_prec = __Pyx_div_long((__pyx_v_minPrec + __pyx_v_maxPrec), 2);

    /* "_cdecimalfp.pyx":783
 *     while True:
 *         prec = (minPrec + maxPrec) // 2
 *         quot, rem = divmod(num * base10pow(prec), den)             # <<<<<<<<<<<<<<
 *         if prec == maxPrec:
 *             break
 */
    __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_prec); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyNumber_Multiply(__pyx_v_num, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyNumber_Divmod(__pyx_t_1, __pyx_v_den); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if ((likely(PyTuple_CheckExact(__pyx_t_2))) || (PyList_CheckExact(__pyx_t_2))) {
      PyObject* sequence = __pyx_t_2;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_1 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_1 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_5 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_5);
      #else
      __pyx_t_1 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      #endif
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_3 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_7 = Py_TYPE(__pyx_t_3)->tp_iternext;
      index = 0; __pyx_t_1 = __pyx_t_7(__pyx_t_3); if (unlikely(!__pyx_t_1)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_1);
      index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_3); if (unlikely(!__pyx_t_5)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_5);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_3), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_7 = NULL;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      goto __pyx_L6_unpacking_done;
      __pyx_L5_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_7 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_L6_unpacking_done:;
    }
    __Pyx_XDECREF_SET(__pyx_v_quot, __pyx_t_1);
    __pyx_t_1 = 0;
    __Pyx_XDECREF_SET(__pyx_v_rem, __pyx_t_5);
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":784
 *         prec = (minPrec + maxPrec) // 2
 *         quot, rem = divmod(num * base10pow(prec), den)
 *         if prec == maxPrec:             # <<<<<<<<<<<<<<
 *             break
 *         if rem == 0:
 */
    __pyx_t_6 = ((__pyx_v_prec == __pyx_v_maxPrec) != 0);
    if (__pyx_t_6) {

      /* "_cdecimalfp.pyx":785
 *         quot, rem = divmod(num * base10pow(prec), den)
 *         if prec == maxPrec:
 *             break             # <<<<<<<<<<<<<<
 *         if rem == 0:
 *             maxPrec = prec
 */
      goto __pyx_L4_break;
    }

    /* "_cdecimalfp.pyx":786
 *         if prec == maxPrec:
 *             break
 *         if rem == 0:             # <<<<<<<<<<<<<<
 *             maxPrec = prec
 *         elif minPrec >= maxPrec - 2:
 */
    __pyx_t_2 = PyObject_RichCompare(__pyx_v_rem, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_6) {

      /* "_cdecimalfp.pyx":787
 *             break
 *         if rem == 0:
 *             maxPrec = prec             # <<<<<<<<<<<<<<
 *         elif minPrec >= maxPrec - 2:
 *             minPrec = maxPrec
 */
      __pyx_v_maxPrec = __pyx_v_prec;
      goto __pyx_L8;
    }

    /* "_cdecimalfp.pyx":788
 *         if rem == 0:
 *             maxPrec = prec
 *         elif minPrec >= maxPrec - 2:             # <<<<<<<<<<<<<<
 *             minPrec = maxPrec
 *         else:
 */
    __pyx_t_6 = ((__pyx_v_minPrec >= (__pyx_v_maxPrec - 2)) != 0);
    if (__pyx_t_6) {

      /* "_cdecimalfp.pyx":789
 *             maxPrec = prec
 *         elif minPrec >= maxPrec - 2:
 *             minPrec = maxPrec             # <<<<<<<<<<<<<<
 *         else:
 *             minPrec = prec
 */
      __pyx_v_minPrec = __pyx_v_maxPrec;
      goto __pyx_L8;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":791
 *             minPrec = maxPrec
 *         else:
 *             minPrec = prec             # <<<<<<<<<<<<<<
 *     dec._value = quot
 *     dec._precision = prec
 */
      __pyx_v_minPrec = __pyx_v_prec;
    }
    __pyx_L8:;
  }
  __pyx_L4_break:;

  /* "_cdecimalfp.pyx":792
 *         else:
 *             minPrec = prec
 *     dec._value = quot             # <<<<<<<<<<<<<<
 *     dec._precision = prec
 *     return (rem != 0)
 */
  if (unlikely(!__pyx_v_quot)) { __Pyx_RaiseUnboundLocalError("quot"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 792; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
  __Pyx_INCREF(__pyx_v_quot);
  __Pyx_GIVEREF(__pyx_v_quot);
  __Pyx_GOTREF(__pyx_v_dec->_value);
  __Pyx_DECREF(__pyx_v_dec->_value);
  __pyx_v_dec->_value = __pyx_v_quot;

  /* "_cdecimalfp.pyx":793
 *             minPrec = prec
 *     dec._value = quot
 *     dec._precision = prec             # <<<<<<<<<<<<<<
 *     return (rem != 0)
 * 
 */
  __pyx_v_dec->_precision = __pyx_v_prec;

  /* "_cdecimalfp.pyx":794
 *     dec._value = quot
 *     dec._precision = prec
 *     return (rem != 0)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  if (unlikely(!__pyx_v_rem)) { __Pyx_RaiseUnboundLocalError("rem"); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} }
  __pyx_t_2 = PyObject_RichCompare(__pyx_v_rem, __pyx_int_0, Py_NE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_r = __pyx_t_6;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":770
 * 
 * 
 * cdef bint _approx_rational(Decimal dec, object num, object den,             # <<<<<<<<<<<<<<
 *                            int minPrec=0) except *:
 *     """Approximate num / den as Decimal.
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_AddTraceback("_cdecimalfp._approx_rational", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_quot);
  __Pyx_XDECREF(__pyx_v_rem);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":829
 * 
 * 
 * def _getFormatParams(formatSpec):             # <<<<<<<<<<<<<<
 *     m = _parseFormatSpec(formatSpec)
 *     if m is None:
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_1_getFormatParams(PyObject *__pyx_self, PyObject *__pyx_v_formatSpec); /*proto*/
static PyMethodDef __pyx_mdef_11_cdecimalfp_1_getFormatParams = {"_getFormatParams", (PyCFunction)__pyx_pw_11_cdecimalfp_1_getFormatParams, METH_O, 0};
static PyObject *__pyx_pw_11_cdecimalfp_1_getFormatParams(PyObject *__pyx_self, PyObject *__pyx_v_formatSpec) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_getFormatParams (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp__getFormatParams(__pyx_self, ((PyObject *)__pyx_v_formatSpec));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp__getFormatParams(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_formatSpec) {
  PyObject *__pyx_v_m = NULL;
  PyObject *__pyx_v_fill = NULL;
  PyObject *__pyx_v_zeropad = NULL;
  PyObject *__pyx_v_fmtFill = NULL;
  PyObject *__pyx_v_fmtAlign = NULL;
  PyObject *__pyx_v_fmtSign = NULL;
  PyObject *__pyx_v_minimumwidth = NULL;
  PyObject *__pyx_v_fmtMinWidth = NULL;
  PyObject *__pyx_v_fmtType = NULL;
  PyObject *__pyx_v_lconv = NULL;
  PyObject *__pyx_v_fmtThousandsSep = NULL;
  PyObject *__pyx_v_fmtGrouping = NULL;
  PyObject *__pyx_v_fmtDecimalPoint = NULL;
  PyObject *__pyx_v_precision = NULL;
  PyObject *__pyx_v_fmtPrecision = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  int __pyx_t_6;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_getFormatParams", 0);

  /* "_cdecimalfp.pyx":830
 * 
 * def _getFormatParams(formatSpec):
 *     m = _parseFormatSpec(formatSpec)             # <<<<<<<<<<<<<<
 *     if m is None:
 *         raise ValueError("Invalid format specifier: " + formatSpec)
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_parseFormatSpec); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_3)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_3) {
    __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v_formatSpec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
  } else {
    __pyx_t_4 = PyTuple_New(1+1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = NULL;
    __Pyx_INCREF(__pyx_v_formatSpec);
    PyTuple_SET_ITEM(__pyx_t_4, 0+1, __pyx_v_formatSpec);
    __Pyx_GIVEREF(__pyx_v_formatSpec);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_4, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_m = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":831
 * def _getFormatParams(formatSpec):
 *     m = _parseFormatSpec(formatSpec)
 *     if m is None:             # <<<<<<<<<<<<<<
 *         raise ValueError("Invalid format specifier: " + formatSpec)
 *     fill = m.group('fill')
 */
  __pyx_t_5 = (__pyx_v_m == Py_None);
  __pyx_t_6 = (__pyx_t_5 != 0);
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":832
 *     m = _parseFormatSpec(formatSpec)
 *     if m is None:
 *         raise ValueError("Invalid format specifier: " + formatSpec)             # <<<<<<<<<<<<<<
 *     fill = m.group('fill')
 *     zeropad = m.group('zeropad')
 */
    __pyx_t_1 = PyNumber_Add(__pyx_kp_s_Invalid_format_specifier, __pyx_v_formatSpec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_t_2, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_Raise(__pyx_t_1, 0, 0, 0);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }

  /* "_cdecimalfp.pyx":833
 *     if m is None:
 *         raise ValueError("Invalid format specifier: " + formatSpec)
 *     fill = m.group('fill')             # <<<<<<<<<<<<<<
 *     zeropad = m.group('zeropad')
 *     if fill:                            # fill overrules zeropad
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_group); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__15, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_fill = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":834
 *         raise ValueError("Invalid format specifier: " + formatSpec)
 *     fill = m.group('fill')
 *     zeropad = m.group('zeropad')             # <<<<<<<<<<<<<<
 *     if fill:                            # fill overrules zeropad
 *         fmtFill = fill
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_group); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__16, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_v_zeropad = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":835
 *     fill = m.group('fill')
 *     zeropad = m.group('zeropad')
 *     if fill:                            # fill overrules zeropad             # <<<<<<<<<<<<<<
 *         fmtFill = fill
 *         fmtAlign = m.group('align')
 */
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_fill); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":836
 *     zeropad = m.group('zeropad')
 *     if fill:                            # fill overrules zeropad
 *         fmtFill = fill             # <<<<<<<<<<<<<<
 *         fmtAlign = m.group('align')
 *     elif zeropad:                       # zeropad overrules align
 */
    __Pyx_INCREF(__pyx_v_fill);
    __pyx_v_fmtFill = __pyx_v_fill;

    /* "_cdecimalfp.pyx":837
 *     if fill:                            # fill overrules zeropad
 *         fmtFill = fill
 *         fmtAlign = m.group('align')             # <<<<<<<<<<<<<<
 *     elif zeropad:                       # zeropad overrules align
 *         fmtFill = '0'
 */
    __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_group); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__17, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_fmtAlign = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L4;
  }

  /* "_cdecimalfp.pyx":838
 *         fmtFill = fill
 *         fmtAlign = m.group('align')
 *     elif zeropad:                       # zeropad overrules align             # <<<<<<<<<<<<<<
 *         fmtFill = '0'
 *         fmtAlign = "="
 */
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_zeropad); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":839
 *         fmtAlign = m.group('align')
 *     elif zeropad:                       # zeropad overrules align
 *         fmtFill = '0'             # <<<<<<<<<<<<<<
 *         fmtAlign = "="
 *     else:
 */
    __Pyx_INCREF(__pyx_kp_s_0);
    __pyx_v_fmtFill = __pyx_kp_s_0;

    /* "_cdecimalfp.pyx":840
 *     elif zeropad:                       # zeropad overrules align
 *         fmtFill = '0'
 *         fmtAlign = "="             # <<<<<<<<<<<<<<
 *     else:
 *         fmtFill = _dfltFormatParams['fill']
 */
    __Pyx_INCREF(__pyx_kp_s__8);
    __pyx_v_fmtAlign = __pyx_kp_s__8;
    goto __pyx_L4;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":842
 *         fmtAlign = "="
 *     else:
 *         fmtFill = _dfltFormatParams['fill']             # <<<<<<<<<<<<<<
 *         fmtAlign = m.group('align') or _dfltFormatParams['align']
 *     fmtSign = m.group('sign') or _dfltFormatParams['sign']
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_dfltFormatParams); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyObject_GetItem(__pyx_t_2, __pyx_n_s_fill); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_fmtFill = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":843
 *     else:
 *         fmtFill = _dfltFormatParams['fill']
 *         fmtAlign = m.group('align') or _dfltFormatParams['align']             # <<<<<<<<<<<<<<
 *     fmtSign = m.group('sign') or _dfltFormatParams['sign']
 *     minimumwidth = m.group('minimumwidth')
 */
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_group); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__18, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (!__pyx_t_6) {
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      __Pyx_INCREF(__pyx_t_4);
      __pyx_t_1 = __pyx_t_4;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      goto __pyx_L5_bool_binop_done;
    }
    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dfltFormatParams); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = PyObject_GetItem(__pyx_t_4, __pyx_n_s_align); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_INCREF(__pyx_t_2);
    __pyx_t_1 = __pyx_t_2;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_L5_bool_binop_done:;
    __pyx_v_fmtAlign = __pyx_t_1;
    __pyx_t_1 = 0;
  }
  __pyx_L4:;

  /* "_cdecimalfp.pyx":844
 *         fmtFill = _dfltFormatParams['fill']
 *         fmtAlign = m.group('align') or _dfltFormatParams['align']
 *     fmtSign = m.group('sign') or _dfltFormatParams['sign']             # <<<<<<<<<<<<<<
 *     minimumwidth = m.group('minimumwidth')
 *     if minimumwidth:
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_group); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__19, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!__pyx_t_6) {
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_1 = __pyx_t_4;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L7_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dfltFormatParams); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = PyObject_GetItem(__pyx_t_4, __pyx_n_s_sign); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_INCREF(__pyx_t_2);
  __pyx_t_1 = __pyx_t_2;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_L7_bool_binop_done:;
  __pyx_v_fmtSign = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":845
 *         fmtAlign = m.group('align') or _dfltFormatParams['align']
 *     fmtSign = m.group('sign') or _dfltFormatParams['sign']
 *     minimumwidth = m.group('minimumwidth')             # <<<<<<<<<<<<<<
 *     if minimumwidth:
 *         fmtMinWidth = int(minimumwidth)
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_group); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__20, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_minimumwidth = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":846
 *     fmtSign = m.group('sign') or _dfltFormatParams['sign']
 *     minimumwidth = m.group('minimumwidth')
 *     if minimumwidth:             # <<<<<<<<<<<<<<
 *         fmtMinWidth = int(minimumwidth)
 *     else:
 */
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_minimumwidth); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 846; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":847
 *     minimumwidth = m.group('minimumwidth')
 *     if minimumwidth:
 *         fmtMinWidth = int(minimumwidth)             # <<<<<<<<<<<<<<
 *     else:
 *         fmtMinWidth = _dfltFormatParams['minimumwidth']
 */
    __pyx_t_2 = PyNumber_Int(__pyx_v_minimumwidth); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 847; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_v_fmtMinWidth = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L9;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":849
 *         fmtMinWidth = int(minimumwidth)
 *     else:
 *         fmtMinWidth = _dfltFormatParams['minimumwidth']             # <<<<<<<<<<<<<<
 *     fmtType = m.group('type') or _dfltFormatParams['type']
 *     if fmtType == 'n':
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_dfltFormatParams); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyObject_GetItem(__pyx_t_2, __pyx_n_s_minimumwidth); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_fmtMinWidth = __pyx_t_1;
    __pyx_t_1 = 0;
  }
  __pyx_L9:;

  /* "_cdecimalfp.pyx":850
 *     else:
 *         fmtMinWidth = _dfltFormatParams['minimumwidth']
 *     fmtType = m.group('type') or _dfltFormatParams['type']             # <<<<<<<<<<<<<<
 *     if fmtType == 'n':
 *         lconv = locale.localeconv()
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_group); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__21, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (!__pyx_t_6) {
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  } else {
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_1 = __pyx_t_4;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L10_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dfltFormatParams); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = PyObject_GetItem(__pyx_t_4, __pyx_n_s_type); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_INCREF(__pyx_t_2);
  __pyx_t_1 = __pyx_t_2;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_L10_bool_binop_done:;
  __pyx_v_fmtType = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":851
 *         fmtMinWidth = _dfltFormatParams['minimumwidth']
 *     fmtType = m.group('type') or _dfltFormatParams['type']
 *     if fmtType == 'n':             # <<<<<<<<<<<<<<
 *         lconv = locale.localeconv()
 *         fmtThousandsSep = m.group('thousands_sep') and lconv['thousands_sep']
 */
  __pyx_t_6 = (__Pyx_PyString_Equals(__pyx_v_fmtType, __pyx_n_s_n, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 851; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":852
 *     fmtType = m.group('type') or _dfltFormatParams['type']
 *     if fmtType == 'n':
 *         lconv = locale.localeconv()             # <<<<<<<<<<<<<<
 *         fmtThousandsSep = m.group('thousands_sep') and lconv['thousands_sep']
 *         fmtGrouping = lconv['grouping']
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_locale); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_localeconv); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_2 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_2)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_2);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    if (__pyx_t_2) {
      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else {
      __pyx_t_1 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 852; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_v_lconv = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":853
 *     if fmtType == 'n':
 *         lconv = locale.localeconv()
 *         fmtThousandsSep = m.group('thousands_sep') and lconv['thousands_sep']             # <<<<<<<<<<<<<<
 *         fmtGrouping = lconv['grouping']
 *         fmtDecimalPoint = lconv['decimal_point']
 */
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_group); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_tuple__22, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_6) {
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    } else {
      __Pyx_INCREF(__pyx_t_2);
      __pyx_t_1 = __pyx_t_2;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      goto __pyx_L13_bool_binop_done;
    }
    __pyx_t_2 = PyObject_GetItem(__pyx_v_lconv, __pyx_n_s_thousands_sep); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_2);
    __pyx_t_1 = __pyx_t_2;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_L13_bool_binop_done:;
    __pyx_v_fmtThousandsSep = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":854
 *         lconv = locale.localeconv()
 *         fmtThousandsSep = m.group('thousands_sep') and lconv['thousands_sep']
 *         fmtGrouping = lconv['grouping']             # <<<<<<<<<<<<<<
 *         fmtDecimalPoint = lconv['decimal_point']
 *     else:
 */
    __pyx_t_1 = PyObject_GetItem(__pyx_v_lconv, __pyx_n_s_grouping); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 854; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_fmtGrouping = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":855
 *         fmtThousandsSep = m.group('thousands_sep') and lconv['thousands_sep']
 *         fmtGrouping = lconv['grouping']
 *         fmtDecimalPoint = lconv['decimal_point']             # <<<<<<<<<<<<<<
 *     else:
 *         fmtThousandsSep = (m.group('thousands_sep') or
 */
    __pyx_t_1 = PyObject_GetItem(__pyx_v_lconv, __pyx_n_s_decimal_point); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 855; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_v_fmtDecimalPoint = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L12;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":857
 *         fmtDecimalPoint = lconv['decimal_point']
 *     else:
 *         fmtThousandsSep = (m.group('thousands_sep') or             # <<<<<<<<<<<<<<
 *                            _dfltFormatParams['thousands_sep'])
 *         fmtGrouping = _dfltFormatParams['grouping']
 */
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_group); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_tuple__23, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (!__pyx_t_6) {
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      __Pyx_INCREF(__pyx_t_4);
      __pyx_t_1 = __pyx_t_4;
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      goto __pyx_L15_bool_binop_done;
    }

    /* "_cdecimalfp.pyx":858
 *     else:
 *         fmtThousandsSep = (m.group('thousands_sep') or
 *                            _dfltFormatParams['thousands_sep'])             # <<<<<<<<<<<<<<
 *         fmtGrouping = _dfltFormatParams['grouping']
 *         fmtDecimalPoint = _dfltFormatParams['decimal_point']
 */
    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_dfltFormatParams); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_2 = PyObject_GetItem(__pyx_t_4, __pyx_n_s_thousands_sep); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 858; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_INCREF(__pyx_t_2);
    __pyx_t_1 = __pyx_t_2;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_L15_bool_binop_done:;
    __pyx_v_fmtThousandsSep = __pyx_t_1;
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":859
 *         fmtThousandsSep = (m.group('thousands_sep') or
 *                            _dfltFormatParams['thousands_sep'])
 *         fmtGrouping = _dfltFormatParams['grouping']             # <<<<<<<<<<<<<<
 *         fmtDecimalPoint = _dfltFormatParams['decimal_point']
 *     precision = m.group('precision')
 */
    __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_dfltFormatParams); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PyObject_GetItem(__pyx_t_1, __pyx_n_s_grouping); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 859; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_v_fmtGrouping = __pyx_t_2;
    __pyx_t_2 = 0;

    /* "_cdecimalfp.pyx":860
 *                            _dfltFormatParams['thousands_sep'])
 *         fmtGrouping = _dfltFormatParams['grouping']
 *         fmtDecimalPoint = _dfltFormatParams['decimal_point']             # <<<<<<<<<<<<<<
 *     precision = m.group('precision')
 *     if precision:
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_dfltFormatParams); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyObject_GetItem(__pyx_t_2, __pyx_n_s_decimal_point); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 860; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_fmtDecimalPoint = __pyx_t_1;
    __pyx_t_1 = 0;
  }
  __pyx_L12:;

  /* "_cdecimalfp.pyx":861
 *         fmtGrouping = _dfltFormatParams['grouping']
 *         fmtDecimalPoint = _dfltFormatParams['decimal_point']
 *     precision = m.group('precision')             # <<<<<<<<<<<<<<
 *     if precision:
 *         fmtPrecision = int(precision)
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_m, __pyx_n_s_group); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_tuple__24, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_v_precision = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":862
 *         fmtDecimalPoint = _dfltFormatParams['decimal_point']
 *     precision = m.group('precision')
 *     if precision:             # <<<<<<<<<<<<<<
 *         fmtPrecision = int(precision)
 *     else:
 */
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_precision); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 862; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":863
 *     precision = m.group('precision')
 *     if precision:
 *         fmtPrecision = int(precision)             # <<<<<<<<<<<<<<
 *     else:
 *         fmtPrecision = None
 */
    __pyx_t_2 = PyNumber_Int(__pyx_v_precision); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 863; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_v_fmtPrecision = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L17;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":865
 *         fmtPrecision = int(precision)
 *     else:
 *         fmtPrecision = None             # <<<<<<<<<<<<<<
 *     return (fmtFill, fmtAlign, fmtSign, fmtMinWidth, fmtThousandsSep,
 *             fmtGrouping, fmtDecimalPoint, fmtPrecision, fmtType)
 */
    __Pyx_INCREF(Py_None);
    __pyx_v_fmtPrecision = Py_None;
  }
  __pyx_L17:;

  /* "_cdecimalfp.pyx":866
 *     else:
 *         fmtPrecision = None
 *     return (fmtFill, fmtAlign, fmtSign, fmtMinWidth, fmtThousandsSep,             # <<<<<<<<<<<<<<
 *             fmtGrouping, fmtDecimalPoint, fmtPrecision, fmtType)
 * 
 */
  __Pyx_XDECREF(__pyx_r);

  /* "_cdecimalfp.pyx":867
 *         fmtPrecision = None
 *     return (fmtFill, fmtAlign, fmtSign, fmtMinWidth, fmtThousandsSep,
 *             fmtGrouping, fmtDecimalPoint, fmtPrecision, fmtType)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_2 = PyTuple_New(9); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 866; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_v_fmtFill);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_fmtFill);
  __Pyx_GIVEREF(__pyx_v_fmtFill);
  __Pyx_INCREF(__pyx_v_fmtAlign);
  PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_fmtAlign);
  __Pyx_GIVEREF(__pyx_v_fmtAlign);
  __Pyx_INCREF(__pyx_v_fmtSign);
  PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_fmtSign);
  __Pyx_GIVEREF(__pyx_v_fmtSign);
  __Pyx_INCREF(__pyx_v_fmtMinWidth);
  PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_fmtMinWidth);
  __Pyx_GIVEREF(__pyx_v_fmtMinWidth);
  __Pyx_INCREF(__pyx_v_fmtThousandsSep);
  PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_v_fmtThousandsSep);
  __Pyx_GIVEREF(__pyx_v_fmtThousandsSep);
  __Pyx_INCREF(__pyx_v_fmtGrouping);
  PyTuple_SET_ITEM(__pyx_t_2, 5, __pyx_v_fmtGrouping);
  __Pyx_GIVEREF(__pyx_v_fmtGrouping);
  __Pyx_INCREF(__pyx_v_fmtDecimalPoint);
  PyTuple_SET_ITEM(__pyx_t_2, 6, __pyx_v_fmtDecimalPoint);
  __Pyx_GIVEREF(__pyx_v_fmtDecimalPoint);
  __Pyx_INCREF(__pyx_v_fmtPrecision);
  PyTuple_SET_ITEM(__pyx_t_2, 7, __pyx_v_fmtPrecision);
  __Pyx_GIVEREF(__pyx_v_fmtPrecision);
  __Pyx_INCREF(__pyx_v_fmtType);
  PyTuple_SET_ITEM(__pyx_t_2, 8, __pyx_v_fmtType);
  __Pyx_GIVEREF(__pyx_v_fmtType);
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":829
 * 
 * 
 * def _getFormatParams(formatSpec):             # <<<<<<<<<<<<<<
 *     m = _parseFormatSpec(formatSpec)
 *     if m is None:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("_cdecimalfp._getFormatParams", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_m);
  __Pyx_XDECREF(__pyx_v_fill);
  __Pyx_XDECREF(__pyx_v_zeropad);
  __Pyx_XDECREF(__pyx_v_fmtFill);
  __Pyx_XDECREF(__pyx_v_fmtAlign);
  __Pyx_XDECREF(__pyx_v_fmtSign);
  __Pyx_XDECREF(__pyx_v_minimumwidth);
  __Pyx_XDECREF(__pyx_v_fmtMinWidth);
  __Pyx_XDECREF(__pyx_v_fmtType);
  __Pyx_XDECREF(__pyx_v_lconv);
  __Pyx_XDECREF(__pyx_v_fmtThousandsSep);
  __Pyx_XDECREF(__pyx_v_fmtGrouping);
  __Pyx_XDECREF(__pyx_v_fmtDecimalPoint);
  __Pyx_XDECREF(__pyx_v_precision);
  __Pyx_XDECREF(__pyx_v_fmtPrecision);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":870
 * 
 * 
 * def _padDigits(digits, minWidth, fill, sep=None, grouping=None):             # <<<<<<<<<<<<<<
 *     nDigits = len(digits)
 *     if sep and grouping:
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_3_padDigits(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/
static PyMethodDef __pyx_mdef_11_cdecimalfp_3_padDigits = {"_padDigits", (PyCFunction)__pyx_pw_11_cdecimalfp_3_padDigits, METH_VARARGS|METH_KEYWORDS, 0};
static PyObject *__pyx_pw_11_cdecimalfp_3_padDigits(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) {
  PyObject *__pyx_v_digits = 0;
  PyObject *__pyx_v_minWidth = 0;
  PyObject *__pyx_v_fill = 0;
  PyObject *__pyx_v_sep = 0;
  PyObject *__pyx_v_grouping = 0;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_padDigits (wrapper)", 0);
  {
    static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_digits,&__pyx_n_s_minWidth,&__pyx_n_s_fill,&__pyx_n_s_sep,&__pyx_n_s_grouping,0};
    PyObject* values[5] = {0,0,0,0,0};
    values[3] = ((PyObject *)Py_None);
    values[4] = ((PyObject *)Py_None);
    if (unlikely(__pyx_kwds)) {
      Py_ssize_t kw_args;
      const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args);
      switch (pos_args) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        case  2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        case  1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        case  0: break;
        default: goto __pyx_L5_argtuple_error;
      }
      kw_args = PyDict_Size(__pyx_kwds);
      switch (pos_args) {
        case  0:
        if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_digits)) != 0)) kw_args--;
        else goto __pyx_L5_argtuple_error;
        case  1:
        if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_minWidth)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_padDigits", 0, 3, 5, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  2:
        if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s_fill)) != 0)) kw_args--;
        else {
          __Pyx_RaiseArgtupleInvalid("_padDigits", 0, 3, 5, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
        }
        case  3:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_sep);
          if (value) { values[3] = value; kw_args--; }
        }
        case  4:
        if (kw_args > 0) {
          PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s_grouping);
          if (value) { values[4] = value; kw_args--; }
        }
      }
      if (unlikely(kw_args > 0)) {
        if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_padDigits") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
      }
    } else {
      switch (PyTuple_GET_SIZE(__pyx_args)) {
        case  5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4);
        case  4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3);
        case  3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2);
        values[1] = PyTuple_GET_ITEM(__pyx_args, 1);
        values[0] = PyTuple_GET_ITEM(__pyx_args, 0);
        break;
        default: goto __pyx_L5_argtuple_error;
      }
    }
    __pyx_v_digits = values[0];
    __pyx_v_minWidth = values[1];
    __pyx_v_fill = values[2];
    __pyx_v_sep = values[3];
    __pyx_v_grouping = values[4];
  }
  goto __pyx_L4_argument_unpacking_done;
  __pyx_L5_argtuple_error:;
  __Pyx_RaiseArgtupleInvalid("_padDigits", 0, 3, 5, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L3_error;}
  __pyx_L3_error:;
  __Pyx_AddTraceback("_cdecimalfp._padDigits", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __Pyx_RefNannyFinishContext();
  return NULL;
  __pyx_L4_argument_unpacking_done:;
  __pyx_r = __pyx_pf_11_cdecimalfp_2_padDigits(__pyx_self, __pyx_v_digits, __pyx_v_minWidth, __pyx_v_fill, __pyx_v_sep, __pyx_v_grouping);

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_2_padDigits(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_digits, PyObject *__pyx_v_minWidth, PyObject *__pyx_v_fill, PyObject *__pyx_v_sep, PyObject *__pyx_v_grouping) {
  PyObject *__pyx_v_nDigits = NULL;
  PyObject *__pyx_v_slices = NULL;
  PyObject *__pyx_v_i = NULL;
  PyObject *__pyx_v_j = NULL;
  PyObject *__pyx_v_limit = NULL;
  PyObject *__pyx_v_l = NULL;
  PyObject *__pyx_v_raw = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  Py_ssize_t __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *(*__pyx_t_9)(PyObject *);
  int __pyx_t_10;
  PyObject *__pyx_t_11 = NULL;
  PyObject *__pyx_t_12 = NULL;
  PyObject *__pyx_t_13 = NULL;
  PyObject *(*__pyx_t_14)(PyObject *);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_padDigits", 0);
  __Pyx_INCREF(__pyx_v_digits);

  /* "_cdecimalfp.pyx":871
 * 
 * def _padDigits(digits, minWidth, fill, sep=None, grouping=None):
 *     nDigits = len(digits)             # <<<<<<<<<<<<<<
 *     if sep and grouping:
 *         slices = []
 */
  __pyx_t_1 = PyObject_Length(__pyx_v_digits); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = PyInt_FromSsize_t(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 871; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_nDigits = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":872
 * def _padDigits(digits, minWidth, fill, sep=None, grouping=None):
 *     nDigits = len(digits)
 *     if sep and grouping:             # <<<<<<<<<<<<<<
 *         slices = []
 *         i = j = 0
 */
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_sep); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_v_grouping); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 872; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = __pyx_t_4;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_3) {

    /* "_cdecimalfp.pyx":873
 *     nDigits = len(digits)
 *     if sep and grouping:
 *         slices = []             # <<<<<<<<<<<<<<
 *         i = j = 0
 *         limit = max(minWidth, nDigits) if fill == '0' else nDigits
 */
    __pyx_t_2 = PyList_New(0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 873; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_v_slices = ((PyObject*)__pyx_t_2);
    __pyx_t_2 = 0;

    /* "_cdecimalfp.pyx":874
 *     if sep and grouping:
 *         slices = []
 *         i = j = 0             # <<<<<<<<<<<<<<
 *         limit = max(minWidth, nDigits) if fill == '0' else nDigits
 *         for l in _iterGrouping(grouping):
 */
    __Pyx_INCREF(__pyx_int_0);
    __pyx_v_i = __pyx_int_0;
    __Pyx_INCREF(__pyx_int_0);
    __pyx_v_j = __pyx_int_0;

    /* "_cdecimalfp.pyx":875
 *         slices = []
 *         i = j = 0
 *         limit = max(minWidth, nDigits) if fill == '0' else nDigits             # <<<<<<<<<<<<<<
 *         for l in _iterGrouping(grouping):
 *             j = min(i + l, limit)
 */
    __pyx_t_3 = (__Pyx_PyString_Equals(__pyx_v_fill, __pyx_kp_s_0, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (__pyx_t_3) {
      __Pyx_INCREF(__pyx_v_nDigits);
      __pyx_t_5 = __pyx_v_nDigits;
      __Pyx_INCREF(__pyx_v_minWidth);
      __pyx_t_6 = __pyx_v_minWidth;
      __pyx_t_8 = PyObject_RichCompare(__pyx_t_5, __pyx_t_6, Py_GT); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 875; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      if (__pyx_t_4) {
        __Pyx_INCREF(__pyx_t_5);
        __pyx_t_7 = __pyx_t_5;
      } else {
        __Pyx_INCREF(__pyx_t_6);
        __pyx_t_7 = __pyx_t_6;
      }
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_INCREF(__pyx_t_7);
      __pyx_t_2 = __pyx_t_7;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    } else {
      __Pyx_INCREF(__pyx_v_nDigits);
      __pyx_t_2 = __pyx_v_nDigits;
    }
    __pyx_v_limit = __pyx_t_2;
    __pyx_t_2 = 0;

    /* "_cdecimalfp.pyx":876
 *         i = j = 0
 *         limit = max(minWidth, nDigits) if fill == '0' else nDigits
 *         for l in _iterGrouping(grouping):             # <<<<<<<<<<<<<<
 *             j = min(i + l, limit)
 *             slices.append((i, j))
 */
    __pyx_t_7 = __Pyx_GetModuleGlobalName(__pyx_n_s_iterGrouping); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_5 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_7))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_7);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_7, function);
      }
    }
    if (!__pyx_t_5) {
      __pyx_t_2 = __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_v_grouping); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
    } else {
      __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
      __Pyx_INCREF(__pyx_v_grouping);
      PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_v_grouping);
      __Pyx_GIVEREF(__pyx_v_grouping);
      __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    }
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (likely(PyList_CheckExact(__pyx_t_2)) || PyTuple_CheckExact(__pyx_t_2)) {
      __pyx_t_7 = __pyx_t_2; __Pyx_INCREF(__pyx_t_7); __pyx_t_1 = 0;
      __pyx_t_9 = NULL;
    } else {
      __pyx_t_1 = -1; __pyx_t_7 = PyObject_GetIter(__pyx_t_2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __pyx_t_9 = Py_TYPE(__pyx_t_7)->tp_iternext; if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    for (;;) {
      if (likely(!__pyx_t_9)) {
        if (likely(PyList_CheckExact(__pyx_t_7))) {
          if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_7)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_2 = PyList_GET_ITEM(__pyx_t_7, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          #else
          __pyx_t_2 = PySequence_ITEM(__pyx_t_7, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          #endif
        } else {
          if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_7)) break;
          #if CYTHON_COMPILING_IN_CPYTHON
          __pyx_t_2 = PyTuple_GET_ITEM(__pyx_t_7, __pyx_t_1); __Pyx_INCREF(__pyx_t_2); __pyx_t_1++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          #else
          __pyx_t_2 = PySequence_ITEM(__pyx_t_7, __pyx_t_1); __pyx_t_1++; if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          #endif
        }
      } else {
        __pyx_t_2 = __pyx_t_9(__pyx_t_7);
        if (unlikely(!__pyx_t_2)) {
          PyObject* exc_type = PyErr_Occurred();
          if (exc_type) {
            if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
            else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 876; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
          }
          break;
        }
        __Pyx_GOTREF(__pyx_t_2);
      }
      __Pyx_XDECREF_SET(__pyx_v_l, __pyx_t_2);
      __pyx_t_2 = 0;

      /* "_cdecimalfp.pyx":877
 *         limit = max(minWidth, nDigits) if fill == '0' else nDigits
 *         for l in _iterGrouping(grouping):
 *             j = min(i + l, limit)             # <<<<<<<<<<<<<<
 *             slices.append((i, j))
 *             if j >= limit:
 */
      __Pyx_INCREF(__pyx_v_limit);
      __pyx_t_2 = __pyx_v_limit;
      __pyx_t_6 = PyNumber_Add(__pyx_v_i, __pyx_v_l); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_8 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_LT); __Pyx_XGOTREF(__pyx_t_8); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_8); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 877; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      if (__pyx_t_3) {
        __Pyx_INCREF(__pyx_t_2);
        __pyx_t_5 = __pyx_t_2;
      } else {
        __Pyx_INCREF(__pyx_t_6);
        __pyx_t_5 = __pyx_t_6;
      }
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_2 = __pyx_t_5;
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF_SET(__pyx_v_j, __pyx_t_2);
      __pyx_t_2 = 0;

      /* "_cdecimalfp.pyx":878
 *         for l in _iterGrouping(grouping):
 *             j = min(i + l, limit)
 *             slices.append((i, j))             # <<<<<<<<<<<<<<
 *             if j >= limit:
 *                 break
 */
      __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_INCREF(__pyx_v_i);
      PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_i);
      __Pyx_GIVEREF(__pyx_v_i);
      __Pyx_INCREF(__pyx_v_j);
      PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_j);
      __Pyx_GIVEREF(__pyx_v_j);
      __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_slices, __pyx_t_2); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 878; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

      /* "_cdecimalfp.pyx":879
 *             j = min(i + l, limit)
 *             slices.append((i, j))
 *             if j >= limit:             # <<<<<<<<<<<<<<
 *                 break
 *             i = j
 */
      __pyx_t_2 = PyObject_RichCompare(__pyx_v_j, __pyx_v_limit, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 879; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      if (__pyx_t_3) {

        /* "_cdecimalfp.pyx":880
 *             slices.append((i, j))
 *             if j >= limit:
 *                 break             # <<<<<<<<<<<<<<
 *             i = j
 *             limit = max(limit - 1, nDigits, i + 1)
 */
        goto __pyx_L7_break;
      }

      /* "_cdecimalfp.pyx":881
 *             if j >= limit:
 *                 break
 *             i = j             # <<<<<<<<<<<<<<
 *             limit = max(limit - 1, nDigits, i + 1)
 *         if j < limit:
 */
      __Pyx_INCREF(__pyx_v_j);
      __Pyx_DECREF_SET(__pyx_v_i, __pyx_v_j);

      /* "_cdecimalfp.pyx":882
 *                 break
 *             i = j
 *             limit = max(limit - 1, nDigits, i + 1)             # <<<<<<<<<<<<<<
 *         if j < limit:
 *             slices.append((j, limit))
 */
      __Pyx_INCREF(__pyx_v_nDigits);
      __pyx_t_2 = __pyx_v_nDigits;
      __pyx_t_5 = PyNumber_Add(__pyx_v_i, __pyx_int_1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __pyx_t_6 = PyNumber_Subtract(__pyx_v_limit, __pyx_int_1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_11 = PyObject_RichCompare(__pyx_t_2, __pyx_t_6, Py_GT); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      if (__pyx_t_3) {
        __Pyx_INCREF(__pyx_t_2);
        __pyx_t_8 = __pyx_t_2;
      } else {
        __Pyx_INCREF(__pyx_t_6);
        __pyx_t_8 = __pyx_t_6;
      }
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_INCREF(__pyx_t_8);
      __pyx_t_6 = __pyx_t_8;
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __pyx_t_11 = PyObject_RichCompare(__pyx_t_5, __pyx_t_6, Py_GT); __Pyx_XGOTREF(__pyx_t_11); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_11); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 882; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
      if (__pyx_t_3) {
        __Pyx_INCREF(__pyx_t_5);
        __pyx_t_8 = __pyx_t_5;
      } else {
        __Pyx_INCREF(__pyx_t_6);
        __pyx_t_8 = __pyx_t_6;
      }
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_t_2 = __pyx_t_8;
      __Pyx_INCREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_DECREF_SET(__pyx_v_limit, __pyx_t_2);
      __pyx_t_2 = 0;

      /* "_cdecimalfp.pyx":876
 *         i = j = 0
 *         limit = max(minWidth, nDigits) if fill == '0' else nDigits
 *         for l in _iterGrouping(grouping):             # <<<<<<<<<<<<<<
 *             j = min(i + l, limit)
 *             slices.append((i, j))
 */
    }
    __pyx_L7_break:;
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;

    /* "_cdecimalfp.pyx":883
 *             i = j
 *             limit = max(limit - 1, nDigits, i + 1)
 *         if j < limit:             # <<<<<<<<<<<<<<
 *             slices.append((j, limit))
 *         digits = (limit - nDigits) * fill + digits
 */
    __pyx_t_7 = PyObject_RichCompare(__pyx_v_j, __pyx_v_limit, Py_LT); __Pyx_XGOTREF(__pyx_t_7); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_7); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 883; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    if (__pyx_t_3) {

      /* "_cdecimalfp.pyx":884
 *             limit = max(limit - 1, nDigits, i + 1)
 *         if j < limit:
 *             slices.append((j, limit))             # <<<<<<<<<<<<<<
 *         digits = (limit - nDigits) * fill + digits
 *         raw = sep.join([digits[limit - j: limit - i]
 */
      __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_INCREF(__pyx_v_j);
      PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_j);
      __Pyx_GIVEREF(__pyx_v_j);
      __Pyx_INCREF(__pyx_v_limit);
      PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_v_limit);
      __Pyx_GIVEREF(__pyx_v_limit);
      __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_slices, __pyx_t_7); if (unlikely(__pyx_t_10 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 884; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L9;
    }
    __pyx_L9:;

    /* "_cdecimalfp.pyx":885
 *         if j < limit:
 *             slices.append((j, limit))
 *         digits = (limit - nDigits) * fill + digits             # <<<<<<<<<<<<<<
 *         raw = sep.join([digits[limit - j: limit - i]
 *                        for i, j in reversed(slices)])
 */
    __pyx_t_7 = PyNumber_Subtract(__pyx_v_limit, __pyx_v_nDigits); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_2 = PyNumber_Multiply(__pyx_t_7, __pyx_v_fill); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = PyNumber_Add(__pyx_t_2, __pyx_v_digits); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 885; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_DECREF_SET(__pyx_v_digits, __pyx_t_7);
    __pyx_t_7 = 0;

    /* "_cdecimalfp.pyx":886
 *             slices.append((j, limit))
 *         digits = (limit - nDigits) * fill + digits
 *         raw = sep.join([digits[limit - j: limit - i]             # <<<<<<<<<<<<<<
 *                        for i, j in reversed(slices)])
 *         return (minWidth - len(raw)) * fill + raw
 */
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_sep, __pyx_n_s_join); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_8 = PyList_New(0); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);

    /* "_cdecimalfp.pyx":887
 *         digits = (limit - nDigits) * fill + digits
 *         raw = sep.join([digits[limit - j: limit - i]
 *                        for i, j in reversed(slices)])             # <<<<<<<<<<<<<<
 *         return (minWidth - len(raw)) * fill + raw
 *     else:
 */
    __pyx_t_5 = __pyx_v_slices; __Pyx_INCREF(__pyx_t_5); __pyx_t_1 = PyList_GET_SIZE(__pyx_t_5) - 1;
    for (;;) {
      if (__pyx_t_1 < 0) break;
      if (__pyx_t_1 >= PyList_GET_SIZE(__pyx_t_5)) break;
      #if CYTHON_COMPILING_IN_CPYTHON
      __pyx_t_6 = PyList_GET_ITEM(__pyx_t_5, __pyx_t_1); __Pyx_INCREF(__pyx_t_6); __pyx_t_1--; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      #else
      __pyx_t_6 = PySequence_ITEM(__pyx_t_5, __pyx_t_1); __pyx_t_1--; if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      #endif
      if ((likely(PyTuple_CheckExact(__pyx_t_6))) || (PyList_CheckExact(__pyx_t_6))) {
        PyObject* sequence = __pyx_t_6;
        #if CYTHON_COMPILING_IN_CPYTHON
        Py_ssize_t size = Py_SIZE(sequence);
        #else
        Py_ssize_t size = PySequence_Size(sequence);
        #endif
        if (unlikely(size != 2)) {
          if (size > 2) __Pyx_RaiseTooManyValuesError(2);
          else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
          {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        }
        #if CYTHON_COMPILING_IN_CPYTHON
        if (likely(PyTuple_CheckExact(sequence))) {
          __pyx_t_11 = PyTuple_GET_ITEM(sequence, 0); 
          __pyx_t_12 = PyTuple_GET_ITEM(sequence, 1); 
        } else {
          __pyx_t_11 = PyList_GET_ITEM(sequence, 0); 
          __pyx_t_12 = PyList_GET_ITEM(sequence, 1); 
        }
        __Pyx_INCREF(__pyx_t_11);
        __Pyx_INCREF(__pyx_t_12);
        #else
        __pyx_t_11 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_11);
        __pyx_t_12 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_12);
        #endif
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      } else {
        Py_ssize_t index = -1;
        __pyx_t_13 = PyObject_GetIter(__pyx_t_6); if (unlikely(!__pyx_t_13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __Pyx_GOTREF(__pyx_t_13);
        __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
        __pyx_t_14 = Py_TYPE(__pyx_t_13)->tp_iternext;
        index = 0; __pyx_t_11 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_11)) goto __pyx_L12_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_11);
        index = 1; __pyx_t_12 = __pyx_t_14(__pyx_t_13); if (unlikely(!__pyx_t_12)) goto __pyx_L12_unpacking_failed;
        __Pyx_GOTREF(__pyx_t_12);
        if (__Pyx_IternextUnpackEndCheck(__pyx_t_14(__pyx_t_13), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_t_14 = NULL;
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        goto __pyx_L13_unpacking_done;
        __pyx_L12_unpacking_failed:;
        __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0;
        __pyx_t_14 = NULL;
        if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        __pyx_L13_unpacking_done:;
      }
      __Pyx_DECREF_SET(__pyx_v_i, __pyx_t_11);
      __pyx_t_11 = 0;
      __Pyx_DECREF_SET(__pyx_v_j, __pyx_t_12);
      __pyx_t_12 = 0;

      /* "_cdecimalfp.pyx":886
 *             slices.append((j, limit))
 *         digits = (limit - nDigits) * fill + digits
 *         raw = sep.join([digits[limit - j: limit - i]             # <<<<<<<<<<<<<<
 *                        for i, j in reversed(slices)])
 *         return (minWidth - len(raw)) * fill + raw
 */
      __pyx_t_6 = PyNumber_Subtract(__pyx_v_limit, __pyx_v_j); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_12 = PyNumber_Subtract(__pyx_v_limit, __pyx_v_i); if (unlikely(!__pyx_t_12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_12);
      __pyx_t_11 = __Pyx_PyObject_GetSlice(__pyx_v_digits, 0, 0, &__pyx_t_6, &__pyx_t_12, NULL, 0, 0, 1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_11);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0;
      if (unlikely(__Pyx_ListComp_Append(__pyx_t_8, (PyObject*)__pyx_t_11))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;

      /* "_cdecimalfp.pyx":887
 *         digits = (limit - nDigits) * fill + digits
 *         raw = sep.join([digits[limit - j: limit - i]
 *                        for i, j in reversed(slices)])             # <<<<<<<<<<<<<<
 *         return (minWidth - len(raw)) * fill + raw
 *     else:
 */
    }
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_2, function);
      }
    }
    if (!__pyx_t_5) {
      __pyx_t_7 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_8); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_GOTREF(__pyx_t_7);
    } else {
      __pyx_t_11 = PyTuple_New(1+1); if (unlikely(!__pyx_t_11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_11);
      PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
      PyTuple_SET_ITEM(__pyx_t_11, 0+1, __pyx_t_8);
      __Pyx_GIVEREF(__pyx_t_8);
      __pyx_t_8 = 0;
      __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_11, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 886; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0;
    }
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_raw = __pyx_t_7;
    __pyx_t_7 = 0;

    /* "_cdecimalfp.pyx":888
 *         raw = sep.join([digits[limit - j: limit - i]
 *                        for i, j in reversed(slices)])
 *         return (minWidth - len(raw)) * fill + raw             # <<<<<<<<<<<<<<
 *     else:
 *         return (minWidth - nDigits) * fill + digits
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = PyObject_Length(__pyx_v_raw); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_7 = PyInt_FromSsize_t(__pyx_t_1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __pyx_t_2 = PyNumber_Subtract(__pyx_v_minWidth, __pyx_t_7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = PyNumber_Multiply(__pyx_t_2, __pyx_v_fill); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyNumber_Add(__pyx_t_7, __pyx_v_raw); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 888; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":890
 *         return (minWidth - len(raw)) * fill + raw
 *     else:
 *         return (minWidth - nDigits) * fill + digits             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = PyNumber_Subtract(__pyx_v_minWidth, __pyx_v_nDigits); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_7 = PyNumber_Multiply(__pyx_t_2, __pyx_v_fill); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = PyNumber_Add(__pyx_t_7, __pyx_v_digits); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 890; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_r = __pyx_t_2;
    __pyx_t_2 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":870
 * 
 * 
 * def _padDigits(digits, minWidth, fill, sep=None, grouping=None):             # <<<<<<<<<<<<<<
 *     nDigits = len(digits)
 *     if sep and grouping:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_11);
  __Pyx_XDECREF(__pyx_t_12);
  __Pyx_XDECREF(__pyx_t_13);
  __Pyx_AddTraceback("_cdecimalfp._padDigits", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_nDigits);
  __Pyx_XDECREF(__pyx_v_slices);
  __Pyx_XDECREF(__pyx_v_i);
  __Pyx_XDECREF(__pyx_v_j);
  __Pyx_XDECREF(__pyx_v_limit);
  __Pyx_XDECREF(__pyx_v_l);
  __Pyx_XDECREF(__pyx_v_raw);
  __Pyx_XDECREF(__pyx_v_digits);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}
static PyObject *__pyx_gb_11_cdecimalfp_6generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value); /* proto */

/* "_cdecimalfp.pyx":893
 * 
 * 
 * def _iterGrouping(grouping):             # <<<<<<<<<<<<<<
 *     l = None
 *     for i in grouping[:-1]:
 */

/* Python wrapper */
static PyObject *__pyx_pw_11_cdecimalfp_5_iterGrouping(PyObject *__pyx_self, PyObject *__pyx_v_grouping); /*proto*/
static PyMethodDef __pyx_mdef_11_cdecimalfp_5_iterGrouping = {"_iterGrouping", (PyCFunction)__pyx_pw_11_cdecimalfp_5_iterGrouping, METH_O, 0};
static PyObject *__pyx_pw_11_cdecimalfp_5_iterGrouping(PyObject *__pyx_self, PyObject *__pyx_v_grouping) {
  PyObject *__pyx_r = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_iterGrouping (wrapper)", 0);
  __pyx_r = __pyx_pf_11_cdecimalfp_4_iterGrouping(__pyx_self, ((PyObject *)__pyx_v_grouping));

  /* function exit code */
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_pf_11_cdecimalfp_4_iterGrouping(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_grouping) {
  struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *__pyx_cur_scope;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_iterGrouping", 0);
  __pyx_cur_scope = (struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *)__pyx_tp_new_11_cdecimalfp___pyx_scope_struct___iterGrouping(__pyx_ptype_11_cdecimalfp___pyx_scope_struct___iterGrouping, __pyx_empty_tuple, NULL);
  if (unlikely(!__pyx_cur_scope)) {
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __Pyx_GOTREF(__pyx_cur_scope);
  __pyx_cur_scope->__pyx_v_grouping = __pyx_v_grouping;
  __Pyx_INCREF(__pyx_cur_scope->__pyx_v_grouping);
  __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_grouping);
  {
    __pyx_GeneratorObject *gen = __Pyx_Generator_New((__pyx_generator_body_t) __pyx_gb_11_cdecimalfp_6generator, (PyObject *) __pyx_cur_scope, __pyx_n_s_iterGrouping, __pyx_n_s_iterGrouping); if (unlikely(!gen)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_cur_scope);
    __Pyx_RefNannyFinishContext();
    return (PyObject *) gen;
  }

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_AddTraceback("_cdecimalfp._iterGrouping", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = NULL;
  __Pyx_DECREF(((PyObject *)__pyx_cur_scope));
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_gb_11_cdecimalfp_6generator(__pyx_GeneratorObject *__pyx_generator, PyObject *__pyx_sent_value) /* generator body */
{
  struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *__pyx_cur_scope = ((struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *)__pyx_generator->closure);
  PyObject *__pyx_r = NULL;
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  Py_ssize_t __pyx_t_3;
  PyObject *(*__pyx_t_4)(PyObject *);
  int __pyx_t_5;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("None", 0);
  switch (__pyx_generator->resume_label) {
    case 0: goto __pyx_L3_first_run;
    case 1: goto __pyx_L6_resume_from_yield;
    case 2: goto __pyx_L10_resume_from_yield;
    case 3: goto __pyx_L11_resume_from_yield;
    default: /* CPython raises the right error here */
    __Pyx_RefNannyFinishContext();
    return NULL;
  }
  __pyx_L3_first_run:;
  if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":894
 * 
 * def _iterGrouping(grouping):
 *     l = None             # <<<<<<<<<<<<<<
 *     for i in grouping[:-1]:
 *         yield i
 */
  __Pyx_INCREF(Py_None);
  __Pyx_GIVEREF(Py_None);
  __pyx_cur_scope->__pyx_v_l = Py_None;

  /* "_cdecimalfp.pyx":895
 * def _iterGrouping(grouping):
 *     l = None
 *     for i in grouping[:-1]:             # <<<<<<<<<<<<<<
 *         yield i
 *         l = i
 */
  __pyx_t_1 = __Pyx_PyObject_GetSlice(__pyx_cur_scope->__pyx_v_grouping, 0, -1, NULL, NULL, &__pyx_slice__25, 0, 1, 1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (likely(PyList_CheckExact(__pyx_t_1)) || PyTuple_CheckExact(__pyx_t_1)) {
    __pyx_t_2 = __pyx_t_1; __Pyx_INCREF(__pyx_t_2); __pyx_t_3 = 0;
    __pyx_t_4 = NULL;
  } else {
    __pyx_t_3 = -1; __pyx_t_2 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = Py_TYPE(__pyx_t_2)->tp_iternext; if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  for (;;) {
    if (likely(!__pyx_t_4)) {
      if (likely(PyList_CheckExact(__pyx_t_2))) {
        if (__pyx_t_3 >= PyList_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_1 = PyList_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        #endif
      } else {
        if (__pyx_t_3 >= PyTuple_GET_SIZE(__pyx_t_2)) break;
        #if CYTHON_COMPILING_IN_CPYTHON
        __pyx_t_1 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_3); __Pyx_INCREF(__pyx_t_1); __pyx_t_3++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        #else
        __pyx_t_1 = PySequence_ITEM(__pyx_t_2, __pyx_t_3); __pyx_t_3++; if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        #endif
      }
    } else {
      __pyx_t_1 = __pyx_t_4(__pyx_t_2);
      if (unlikely(!__pyx_t_1)) {
        PyObject* exc_type = PyErr_Occurred();
        if (exc_type) {
          if (likely(exc_type == PyExc_StopIteration || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) PyErr_Clear();
          else {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
        }
        break;
      }
      __Pyx_GOTREF(__pyx_t_1);
    }
    __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_i);
    __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_i, __pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_1);
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":896
 *     l = None
 *     for i in grouping[:-1]:
 *         yield i             # <<<<<<<<<<<<<<
 *         l = i
 *     i = grouping[-1]
 */
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_i);
    __pyx_r = __pyx_cur_scope->__pyx_v_i;
    __Pyx_XGIVEREF(__pyx_t_2);
    __pyx_cur_scope->__pyx_t_0 = __pyx_t_2;
    __pyx_cur_scope->__pyx_t_1 = __pyx_t_3;
    __pyx_cur_scope->__pyx_t_2 = __pyx_t_4;
    __Pyx_XGIVEREF(__pyx_r);
    __Pyx_RefNannyFinishContext();
    /* return from generator, yielding value */
    __pyx_generator->resume_label = 1;
    return __pyx_r;
    __pyx_L6_resume_from_yield:;
    __pyx_t_2 = __pyx_cur_scope->__pyx_t_0;
    __pyx_cur_scope->__pyx_t_0 = 0;
    __Pyx_XGOTREF(__pyx_t_2);
    __pyx_t_3 = __pyx_cur_scope->__pyx_t_1;
    __pyx_t_4 = __pyx_cur_scope->__pyx_t_2;
    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 896; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

    /* "_cdecimalfp.pyx":897
 *     for i in grouping[:-1]:
 *         yield i
 *         l = i             # <<<<<<<<<<<<<<
 *     i = grouping[-1]
 *     if i == 0:
 */
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_i);
    __Pyx_GOTREF(__pyx_cur_scope->__pyx_v_l);
    __Pyx_DECREF_SET(__pyx_cur_scope->__pyx_v_l, __pyx_cur_scope->__pyx_v_i);
    __Pyx_GIVEREF(__pyx_cur_scope->__pyx_v_i);

    /* "_cdecimalfp.pyx":895
 * def _iterGrouping(grouping):
 *     l = None
 *     for i in grouping[:-1]:             # <<<<<<<<<<<<<<
 *         yield i
 *         l = i
 */
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":898
 *         yield i
 *         l = i
 *     i = grouping[-1]             # <<<<<<<<<<<<<<
 *     if i == 0:
 *         while l:
 */
  __pyx_t_2 = __Pyx_GetItemInt(__pyx_cur_scope->__pyx_v_grouping, -1, long, 1, __Pyx_PyInt_From_long, 0, 1, 1); if (unlikely(__pyx_t_2 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 898; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_i);
  __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_i, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":899
 *         l = i
 *     i = grouping[-1]
 *     if i == 0:             # <<<<<<<<<<<<<<
 *         while l:
 *             yield l
 */
  __pyx_t_2 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_i, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 899; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":900
 *     i = grouping[-1]
 *     if i == 0:
 *         while l:             # <<<<<<<<<<<<<<
 *             yield l
 *     elif i != locale.CHAR_MAX:
 */
    while (1) {
      __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_cur_scope->__pyx_v_l); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 900; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      if (!__pyx_t_5) break;

      /* "_cdecimalfp.pyx":901
 *     if i == 0:
 *         while l:
 *             yield l             # <<<<<<<<<<<<<<
 *     elif i != locale.CHAR_MAX:
 *         yield i
 */
      __Pyx_INCREF(__pyx_cur_scope->__pyx_v_l);
      __pyx_r = __pyx_cur_scope->__pyx_v_l;
      __Pyx_XGIVEREF(__pyx_r);
      __Pyx_RefNannyFinishContext();
      /* return from generator, yielding value */
      __pyx_generator->resume_label = 2;
      return __pyx_r;
      __pyx_L10_resume_from_yield:;
      if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 901; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    goto __pyx_L7;
  }

  /* "_cdecimalfp.pyx":902
 *         while l:
 *             yield l
 *     elif i != locale.CHAR_MAX:             # <<<<<<<<<<<<<<
 *         yield i
 * 
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_locale); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_CHAR_MAX); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyObject_RichCompare(__pyx_cur_scope->__pyx_v_i, __pyx_t_1, Py_NE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_5 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_5 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 902; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":903
 *             yield l
 *     elif i != locale.CHAR_MAX:
 *         yield i             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_INCREF(__pyx_cur_scope->__pyx_v_i);
    __pyx_r = __pyx_cur_scope->__pyx_v_i;
    __Pyx_XGIVEREF(__pyx_r);
    __Pyx_RefNannyFinishContext();
    /* return from generator, yielding value */
    __pyx_generator->resume_label = 3;
    return __pyx_r;
    __pyx_L11_resume_from_yield:;
    if (unlikely(!__pyx_sent_value)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 903; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    goto __pyx_L7;
  }
  __pyx_L7:;

  /* "_cdecimalfp.pyx":893
 * 
 * 
 * def _iterGrouping(grouping):             # <<<<<<<<<<<<<<
 *     l = None
 *     for i in grouping[:-1]:
 */

  /* function exit code */
  PyErr_SetNone(PyExc_StopIteration);
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_iterGrouping", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_r);
  __pyx_generator->resume_label = -1;
  __Pyx_Generator_clear((PyObject*)__pyx_generator);
  __Pyx_RefNannyFinishContext();
  return NULL;
}

/* "_cdecimalfp.pyx":909
 * 
 * 
 * cdef void _adjust(Decimal dec, int prec, object rounding=None) except *:             # <<<<<<<<<<<<<<
 *     """Adjust Decimal `dec` to precision `prec` using given rounding mode
 *     (or default mode if none is given)."""
 */

static void __pyx_f_11_cdecimalfp__adjust(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_dec, int __pyx_v_prec, struct __pyx_opt_args_11_cdecimalfp__adjust *__pyx_optional_args) {
  PyObject *__pyx_v_rounding = ((PyObject *)Py_None);
  int __pyx_v_dp;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  struct __pyx_opt_args_11_cdecimalfp__div_rounded __pyx_t_5;
  long __pyx_t_6;
  int __pyx_t_7;
  long __pyx_t_8;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_adjust", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_rounding = __pyx_optional_args->rounding;
    }
  }

  /* "_cdecimalfp.pyx":913
 *     (or default mode if none is given)."""
 *     cdef int dp
 *     dp = prec - dec._precision             # <<<<<<<<<<<<<<
 *     if dp == 0:
 *         return
 */
  __pyx_v_dp = (__pyx_v_prec - __pyx_v_dec->_precision);

  /* "_cdecimalfp.pyx":914
 *     cdef int dp
 *     dp = prec - dec._precision
 *     if dp == 0:             # <<<<<<<<<<<<<<
 *         return
 *     elif dp > 0:
 */
  __pyx_t_1 = ((__pyx_v_dp == 0) != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":915
 *     dp = prec - dec._precision
 *     if dp == 0:
 *         return             # <<<<<<<<<<<<<<
 *     elif dp > 0:
 *         dec._value *= base10pow(dp)
 */
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":916
 *     if dp == 0:
 *         return
 *     elif dp > 0:             # <<<<<<<<<<<<<<
 *         dec._value *= base10pow(dp)
 *     elif prec >= 0:
 */
  __pyx_t_1 = ((__pyx_v_dp > 0) != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":917
 *         return
 *     elif dp > 0:
 *         dec._value *= base10pow(dp)             # <<<<<<<<<<<<<<
 *     elif prec >= 0:
 *         dec._value =  _div_rounded(dec._value, base10pow(-dp), rounding)
 */
    __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_dp); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PyNumber_InPlaceMultiply(__pyx_v_dec->_value, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 917; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GIVEREF(__pyx_t_3);
    __Pyx_GOTREF(__pyx_v_dec->_value);
    __Pyx_DECREF(__pyx_v_dec->_value);
    __pyx_v_dec->_value = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L3;
  }

  /* "_cdecimalfp.pyx":918
 *     elif dp > 0:
 *         dec._value *= base10pow(dp)
 *     elif prec >= 0:             # <<<<<<<<<<<<<<
 *         dec._value =  _div_rounded(dec._value, base10pow(-dp), rounding)
 *     else:
 */
  __pyx_t_1 = ((__pyx_v_prec >= 0) != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":919
 *         dec._value *= base10pow(dp)
 *     elif prec >= 0:
 *         dec._value =  _div_rounded(dec._value, base10pow(-dp), rounding)             # <<<<<<<<<<<<<<
 *     else:
 *         dec._value = (_div_rounded(dec._value, base10pow(-dp), rounding)
 */
    __pyx_t_3 = __pyx_v_dec->_value;
    __Pyx_INCREF(__pyx_t_3);
    __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_dp)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5.__pyx_n = 1;
    __pyx_t_5.rounding = __pyx_v_rounding;
    __pyx_t_4 = __pyx_f_11_cdecimalfp__div_rounded(__pyx_t_3, __pyx_t_2, &__pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 919; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_v_dec->_value);
    __Pyx_DECREF(__pyx_v_dec->_value);
    __pyx_v_dec->_value = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L3;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":921
 *         dec._value =  _div_rounded(dec._value, base10pow(-dp), rounding)
 *     else:
 *         dec._value = (_div_rounded(dec._value, base10pow(-dp), rounding)             # <<<<<<<<<<<<<<
 *                       * base10pow(-prec))
 *     dec._precision = max(prec, 0)
 */
    __pyx_t_4 = __pyx_v_dec->_value;
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_dp)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5.__pyx_n = 1;
    __pyx_t_5.rounding = __pyx_v_rounding;
    __pyx_t_3 = __pyx_f_11_cdecimalfp__div_rounded(__pyx_t_4, __pyx_t_2, &__pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 921; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "_cdecimalfp.pyx":922
 *     else:
 *         dec._value = (_div_rounded(dec._value, base10pow(-dp), rounding)
 *                       * base10pow(-prec))             # <<<<<<<<<<<<<<
 *     dec._precision = max(prec, 0)
 * 
 */
    __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_prec)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 922; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = PyNumber_Multiply(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 922; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "_cdecimalfp.pyx":921
 *         dec._value =  _div_rounded(dec._value, base10pow(-dp), rounding)
 *     else:
 *         dec._value = (_div_rounded(dec._value, base10pow(-dp), rounding)             # <<<<<<<<<<<<<<
 *                       * base10pow(-prec))
 *     dec._precision = max(prec, 0)
 */
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_v_dec->_value);
    __Pyx_DECREF(__pyx_v_dec->_value);
    __pyx_v_dec->_value = __pyx_t_4;
    __pyx_t_4 = 0;
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":923
 *         dec._value = (_div_rounded(dec._value, base10pow(-dp), rounding)
 *                       * base10pow(-prec))
 *     dec._precision = max(prec, 0)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_6 = 0;
  __pyx_t_7 = __pyx_v_prec;
  if (((__pyx_t_6 > __pyx_t_7) != 0)) {
    __pyx_t_8 = __pyx_t_6;
  } else {
    __pyx_t_8 = __pyx_t_7;
  }
  __pyx_v_dec->_precision = __pyx_t_8;

  /* "_cdecimalfp.pyx":909
 * 
 * 
 * cdef void _adjust(Decimal dec, int prec, object rounding=None) except *:             # <<<<<<<<<<<<<<
 *     """Adjust Decimal `dec` to precision `prec` using given rounding mode
 *     (or default mode if none is given)."""
 */

  /* function exit code */
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("_cdecimalfp._adjust", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
}

/* "_cdecimalfp.pyx":926
 * 
 * 
 * cdef object _get_adjusted_value(Decimal dec, int prec, object rounding=None):             # <<<<<<<<<<<<<<
 *     """Return rv so that rv // 10 ** rp = v // 10 ** p,
 *     rounded to precision rp using given rounding mode (or default mode if none
 */

static PyObject *__pyx_f_11_cdecimalfp__get_adjusted_value(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_dec, int __pyx_v_prec, struct __pyx_opt_args_11_cdecimalfp__get_adjusted_value *__pyx_optional_args) {
  PyObject *__pyx_v_rounding = ((PyObject *)Py_None);
  int __pyx_v_dp;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  struct __pyx_opt_args_11_cdecimalfp__div_rounded __pyx_t_5;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_get_adjusted_value", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_rounding = __pyx_optional_args->rounding;
    }
  }

  /* "_cdecimalfp.pyx":931
 *     is given)."""
 *     cdef int dp
 *     dp = prec - dec._precision             # <<<<<<<<<<<<<<
 *     if dp == 0:
 *         return dec._value
 */
  __pyx_v_dp = (__pyx_v_prec - __pyx_v_dec->_precision);

  /* "_cdecimalfp.pyx":932
 *     cdef int dp
 *     dp = prec - dec._precision
 *     if dp == 0:             # <<<<<<<<<<<<<<
 *         return dec._value
 *     elif dp > 0:
 */
  __pyx_t_1 = ((__pyx_v_dp == 0) != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":933
 *     dp = prec - dec._precision
 *     if dp == 0:
 *         return dec._value             # <<<<<<<<<<<<<<
 *     elif dp > 0:
 *         return dec._value * base10pow(dp)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_dec->_value);
    __pyx_r = __pyx_v_dec->_value;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":934
 *     if dp == 0:
 *         return dec._value
 *     elif dp > 0:             # <<<<<<<<<<<<<<
 *         return dec._value * base10pow(dp)
 *     elif prec >= 0:
 */
  __pyx_t_1 = ((__pyx_v_dp > 0) != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":935
 *         return dec._value
 *     elif dp > 0:
 *         return dec._value * base10pow(dp)             # <<<<<<<<<<<<<<
 *     elif prec >= 0:
 *         return _div_rounded(dec._value, base10pow(-dp), rounding)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_dp); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PyNumber_Multiply(__pyx_v_dec->_value, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 935; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_3;
    __pyx_t_3 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":936
 *     elif dp > 0:
 *         return dec._value * base10pow(dp)
 *     elif prec >= 0:             # <<<<<<<<<<<<<<
 *         return _div_rounded(dec._value, base10pow(-dp), rounding)
 *     else:
 */
  __pyx_t_1 = ((__pyx_v_prec >= 0) != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":937
 *         return dec._value * base10pow(dp)
 *     elif prec >= 0:
 *         return _div_rounded(dec._value, base10pow(-dp), rounding)             # <<<<<<<<<<<<<<
 *     else:
 *         return (_div_rounded(dec._value, base10pow(-dp), rounding)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_3 = __pyx_v_dec->_value;
    __Pyx_INCREF(__pyx_t_3);
    __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_dp)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5.__pyx_n = 1;
    __pyx_t_5.rounding = __pyx_v_rounding;
    __pyx_t_4 = __pyx_f_11_cdecimalfp__div_rounded(__pyx_t_3, __pyx_t_2, &__pyx_t_5); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 937; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":939
 *         return _div_rounded(dec._value, base10pow(-dp), rounding)
 *     else:
 *         return (_div_rounded(dec._value, base10pow(-dp), rounding)             # <<<<<<<<<<<<<<
 *                 * base10pow(-prec))
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __pyx_v_dec->_value;
    __Pyx_INCREF(__pyx_t_4);
    __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_dp)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5.__pyx_n = 1;
    __pyx_t_5.rounding = __pyx_v_rounding;
    __pyx_t_3 = __pyx_f_11_cdecimalfp__div_rounded(__pyx_t_4, __pyx_t_2, &__pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 939; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

    /* "_cdecimalfp.pyx":940
 *     else:
 *         return (_div_rounded(dec._value, base10pow(-dp), rounding)
 *                 * base10pow(-prec))             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_prec)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 940; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_4 = PyNumber_Multiply(__pyx_t_3, __pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 940; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":926
 * 
 * 
 * cdef object _get_adjusted_value(Decimal dec, int prec, object rounding=None):             # <<<<<<<<<<<<<<
 *     """Return rv so that rv // 10 ** rp = v // 10 ** p,
 *     rounded to precision rp using given rounding mode (or default mode if none
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("_cdecimalfp._get_adjusted_value", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":943
 * 
 * 
 * cdef tuple _reduce(Decimal dec):             # <<<<<<<<<<<<<<
 *     """Return rv, rp so that rv // 10 ** rp = dec and rv % 10 != 0
 *     """
 */

static PyObject *__pyx_f_11_cdecimalfp__reduce(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_dec) {
  PyObject *__pyx_v_v = NULL;
  PyObject *__pyx_v_p = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_reduce", 0);

  /* "_cdecimalfp.pyx":946
 *     """Return rv, rp so that rv // 10 ** rp = dec and rv % 10 != 0
 *     """
 *     v, p = dec._value, dec._precision             # <<<<<<<<<<<<<<
 *     if v == 0:
 *         return 0, 0
 */
  __pyx_t_1 = __pyx_v_dec->_value;
  __Pyx_INCREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_dec->_precision); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 946; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_v_v = __pyx_t_1;
  __pyx_t_1 = 0;
  __pyx_v_p = __pyx_t_2;
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":947
 *     """
 *     v, p = dec._value, dec._precision
 *     if v == 0:             # <<<<<<<<<<<<<<
 *         return 0, 0
 *     while p > 0 and v % 10 == 0:
 */
  __pyx_t_2 = PyObject_RichCompare(__pyx_v_v, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 947; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 947; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_3) {

    /* "_cdecimalfp.pyx":948
 *     v, p = dec._value, dec._precision
 *     if v == 0:
 *         return 0, 0             # <<<<<<<<<<<<<<
 *     while p > 0 and v % 10 == 0:
 *         p -= 1
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_tuple__26);
    __pyx_r = __pyx_tuple__26;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":949
 *     if v == 0:
 *         return 0, 0
 *     while p > 0 and v % 10 == 0:             # <<<<<<<<<<<<<<
 *         p -= 1
 *         v = v // 10
 */
  while (1) {
    __pyx_t_2 = PyObject_RichCompare(__pyx_v_p, __pyx_int_0, Py_GT); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    if (__pyx_t_4) {
    } else {
      __pyx_t_3 = __pyx_t_4;
      goto __pyx_L6_bool_binop_done;
    }
    __pyx_t_2 = PyNumber_Remainder(__pyx_v_v, __pyx_int_10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 949; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_3 = __pyx_t_4;
    __pyx_L6_bool_binop_done:;
    if (!__pyx_t_3) break;

    /* "_cdecimalfp.pyx":950
 *         return 0, 0
 *     while p > 0 and v % 10 == 0:
 *         p -= 1             # <<<<<<<<<<<<<<
 *         v = v // 10
 *     return v, p
 */
    __pyx_t_1 = PyNumber_InPlaceSubtract(__pyx_v_p, __pyx_int_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 950; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_p, __pyx_t_1);
    __pyx_t_1 = 0;

    /* "_cdecimalfp.pyx":951
 *     while p > 0 and v % 10 == 0:
 *         p -= 1
 *         v = v // 10             # <<<<<<<<<<<<<<
 *     return v, p
 * 
 */
    __pyx_t_1 = PyNumber_FloorDivide(__pyx_v_v, __pyx_int_10); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 951; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF_SET(__pyx_v_v, __pyx_t_1);
    __pyx_t_1 = 0;
  }

  /* "_cdecimalfp.pyx":952
 *         p -= 1
 *         v = v // 10
 *     return v, p             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 952; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_v_v);
  PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_v);
  __Pyx_GIVEREF(__pyx_v_v);
  __Pyx_INCREF(__pyx_v_p);
  PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_p);
  __Pyx_GIVEREF(__pyx_v_p);
  __pyx_r = ((PyObject*)__pyx_t_1);
  __pyx_t_1 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":943
 * 
 * 
 * cdef tuple _reduce(Decimal dec):             # <<<<<<<<<<<<<<
 *     """Return rv, rp so that rv // 10 ** rp = dec and rv % 10 != 0
 *     """
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp._reduce", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_v);
  __Pyx_XDECREF(__pyx_v_p);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":956
 * 
 * # divide x by y, return rounded result
 * cdef object _div_rounded(object x, object y, object rounding=None):             # <<<<<<<<<<<<<<
 *     """Return x // y, rounded using given rounding mode (or default mode
 *     if none is given)."""
 */

static PyObject *__pyx_f_11_cdecimalfp__div_rounded(PyObject *__pyx_v_x, PyObject *__pyx_v_y, struct __pyx_opt_args_11_cdecimalfp__div_rounded *__pyx_optional_args) {
  PyObject *__pyx_v_rounding = ((PyObject *)Py_None);
  PyObject *__pyx_v_quot = NULL;
  PyObject *__pyx_v_rem = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *(*__pyx_t_5)(PyObject *);
  int __pyx_t_6;
  int __pyx_t_7;
  struct __pyx_opt_args_11_cdecimalfp__round __pyx_t_8;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_div_rounded", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_rounding = __pyx_optional_args->rounding;
    }
  }

  /* "_cdecimalfp.pyx":959
 *     """Return x // y, rounded using given rounding mode (or default mode
 *     if none is given)."""
 *     quot, rem = divmod(x, y)             # <<<<<<<<<<<<<<
 *     if rem == 0:              # no need for rounding
 *         return quot
 */
  __pyx_t_1 = PyNumber_Divmod(__pyx_v_x, __pyx_v_y); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if ((likely(PyTuple_CheckExact(__pyx_t_1))) || (PyList_CheckExact(__pyx_t_1))) {
    PyObject* sequence = __pyx_t_1;
    #if CYTHON_COMPILING_IN_CPYTHON
    Py_ssize_t size = Py_SIZE(sequence);
    #else
    Py_ssize_t size = PySequence_Size(sequence);
    #endif
    if (unlikely(size != 2)) {
      if (size > 2) __Pyx_RaiseTooManyValuesError(2);
      else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    #if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyTuple_CheckExact(sequence))) {
      __pyx_t_2 = PyTuple_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyTuple_GET_ITEM(sequence, 1); 
    } else {
      __pyx_t_2 = PyList_GET_ITEM(sequence, 0); 
      __pyx_t_3 = PyList_GET_ITEM(sequence, 1); 
    }
    __Pyx_INCREF(__pyx_t_2);
    __Pyx_INCREF(__pyx_t_3);
    #else
    __pyx_t_2 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_3 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    #endif
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    Py_ssize_t index = -1;
    __pyx_t_4 = PyObject_GetIter(__pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_5 = Py_TYPE(__pyx_t_4)->tp_iternext;
    index = 0; __pyx_t_2 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_2)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_2);
    index = 1; __pyx_t_3 = __pyx_t_5(__pyx_t_4); if (unlikely(!__pyx_t_3)) goto __pyx_L3_unpacking_failed;
    __Pyx_GOTREF(__pyx_t_3);
    if (__Pyx_IternextUnpackEndCheck(__pyx_t_5(__pyx_t_4), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_5 = NULL;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    goto __pyx_L4_unpacking_done;
    __pyx_L3_unpacking_failed:;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_5 = NULL;
    if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
    {__pyx_filename = __pyx_f[0]; __pyx_lineno = 959; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_L4_unpacking_done:;
  }
  __pyx_v_quot = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_rem = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "_cdecimalfp.pyx":960
 *     if none is given)."""
 *     quot, rem = divmod(x, y)
 *     if rem == 0:              # no need for rounding             # <<<<<<<<<<<<<<
 *         return quot
 *     return quot + _round(quot, rem, y, rounding)
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_rem, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 960; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_6) {

    /* "_cdecimalfp.pyx":961
 *     quot, rem = divmod(x, y)
 *     if rem == 0:              # no need for rounding
 *         return quot             # <<<<<<<<<<<<<<
 *     return quot + _round(quot, rem, y, rounding)
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_quot);
    __pyx_r = __pyx_v_quot;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":962
 *     if rem == 0:              # no need for rounding
 *         return quot
 *     return quot + _round(quot, rem, y, rounding)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_8.__pyx_n = 1;
  __pyx_t_8.rounding = __pyx_v_rounding;
  __pyx_t_7 = __pyx_f_11_cdecimalfp__round(__pyx_v_quot, __pyx_v_rem, __pyx_v_y, &__pyx_t_8); 
  __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_t_7); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_3 = PyNumber_Add(__pyx_v_quot, __pyx_t_1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 962; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":956
 * 
 * # divide x by y, return rounded result
 * cdef object _div_rounded(object x, object y, object rounding=None):             # <<<<<<<<<<<<<<
 *     """Return x // y, rounded using given rounding mode (or default mode
 *     if none is given)."""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("_cdecimalfp._div_rounded", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_quot);
  __Pyx_XDECREF(__pyx_v_rem);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":965
 * 
 * 
 * cdef object _int(object v, int p):             # <<<<<<<<<<<<<<
 *     """Return integral part of decimal: int(v * 10 ** -p)"""
 *     if p == 0:
 */

static PyObject *__pyx_f_11_cdecimalfp__int(PyObject *__pyx_v_v, int __pyx_v_p) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_int", 0);

  /* "_cdecimalfp.pyx":967
 * cdef object _int(object v, int p):
 *     """Return integral part of decimal: int(v * 10 ** -p)"""
 *     if p == 0:             # <<<<<<<<<<<<<<
 *         return v
 *     return PyNumber_Long(v * base10pow(-p))
 */
  __pyx_t_1 = ((__pyx_v_p == 0) != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":968
 *     """Return integral part of decimal: int(v * 10 ** -p)"""
 *     if p == 0:
 *         return v             # <<<<<<<<<<<<<<
 *     return PyNumber_Long(v * base10pow(-p))
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_v_v);
    __pyx_r = __pyx_v_v;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":969
 *     if p == 0:
 *         return v
 *     return PyNumber_Long(v * base10pow(-p))             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_p)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyNumber_Multiply(__pyx_v_v, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Long(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 969; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":965
 * 
 * 
 * cdef object _int(object v, int p):             # <<<<<<<<<<<<<<
 *     """Return integral part of decimal: int(v * 10 ** -p)"""
 *     if p == 0:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_AddTraceback("_cdecimalfp._int", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":972
 * 
 * 
 * cdef object _frac(object v, int p):             # <<<<<<<<<<<<<<
 *     """Return fractional part of decimal as integer:
 *     v - int(v * 10 ** -p) * 10 ** p"""
 */

static PyObject *__pyx_f_11_cdecimalfp__frac(PyObject *__pyx_v_v, int __pyx_v_p) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_frac", 0);

  /* "_cdecimalfp.pyx":975
 *     """Return fractional part of decimal as integer:
 *     v - int(v * 10 ** -p) * 10 ** p"""
 *     if p == 0:             # <<<<<<<<<<<<<<
 *         return 0
 *     return v - PyNumber_Long(v * base10pow(-p)) * base10pow(p)
 */
  __pyx_t_1 = ((__pyx_v_p == 0) != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":976
 *     v - int(v * 10 ** -p) * 10 ** p"""
 *     if p == 0:
 *         return 0             # <<<<<<<<<<<<<<
 *     return v - PyNumber_Long(v * base10pow(-p)) * base10pow(p)
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_int_0);
    __pyx_r = __pyx_int_0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":977
 *     if p == 0:
 *         return 0
 *     return v - PyNumber_Long(v * base10pow(-p)) * base10pow(p)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_2 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_p)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_3 = PyNumber_Multiply(__pyx_v_v, __pyx_t_2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Long(__pyx_t_3); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_p); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyNumber_Multiply(__pyx_t_2, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_3 = PyNumber_Subtract(__pyx_v_v, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 977; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":972
 * 
 * 
 * cdef object _frac(object v, int p):             # <<<<<<<<<<<<<<
 *     """Return fractional part of decimal as integer:
 *     v - int(v * 10 ** -p) * 10 ** p"""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_AddTraceback("_cdecimalfp._frac", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":980
 * 
 * 
 * cdef object _div(object num, object den, int minPrec):             # <<<<<<<<<<<<<<
 *     """Return num / den as Decimal, if possible with precision <=
 *     max(minPrec, LIMIT_PREC), otherwise as Fraction"""
 */

static PyObject *__pyx_f_11_cdecimalfp__div(PyObject *__pyx_v_num, PyObject *__pyx_v_den, int __pyx_v_minPrec) {
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_dec = 0;
  int __pyx_v_rem;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  struct __pyx_opt_args_11_cdecimalfp__approx_rational __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  Py_ssize_t __pyx_t_6;
  PyObject *__pyx_t_7 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_div", 0);

  /* "_cdecimalfp.pyx":984
 *     max(minPrec, LIMIT_PREC), otherwise as Fraction"""
 *     cdef Decimal dec
 *     dec = Decimal()             # <<<<<<<<<<<<<<
 *     rem = _approx_rational(dec, num, den, minPrec)
 *     if rem == 0:
 */
  __pyx_t_1 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 984; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_dec = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_1);
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":985
 *     cdef Decimal dec
 *     dec = Decimal()
 *     rem = _approx_rational(dec, num, den, minPrec)             # <<<<<<<<<<<<<<
 *     if rem == 0:
 *         return dec
 */
  __pyx_t_3.__pyx_n = 1;
  __pyx_t_3.minPrec = __pyx_v_minPrec;
  __pyx_t_2 = __pyx_f_11_cdecimalfp__approx_rational(__pyx_v_dec, __pyx_v_num, __pyx_v_den, &__pyx_t_3); if (unlikely(PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 985; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_v_rem = __pyx_t_2;

  /* "_cdecimalfp.pyx":986
 *     dec = Decimal()
 *     rem = _approx_rational(dec, num, den, minPrec)
 *     if rem == 0:             # <<<<<<<<<<<<<<
 *         return dec
 *     else:
 */
  __pyx_t_2 = ((__pyx_v_rem == 0) != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":987
 *     rem = _approx_rational(dec, num, den, minPrec)
 *     if rem == 0:
 *         return dec             # <<<<<<<<<<<<<<
 *     else:
 *         return Fraction(num, den)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_dec));
    __pyx_r = ((PyObject *)__pyx_v_dec);
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":989
 *         return dec
 *     else:
 *         return Fraction(num, den)             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_Fraction); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = NULL;
    __pyx_t_6 = 0;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
        __pyx_t_6 = 1;
      }
    }
    __pyx_t_7 = PyTuple_New(2+__pyx_t_6); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    if (__pyx_t_5) {
      PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
    }
    __Pyx_INCREF(__pyx_v_num);
    PyTuple_SET_ITEM(__pyx_t_7, 0+__pyx_t_6, __pyx_v_num);
    __Pyx_GIVEREF(__pyx_v_num);
    __Pyx_INCREF(__pyx_v_den);
    PyTuple_SET_ITEM(__pyx_t_7, 1+__pyx_t_6, __pyx_v_den);
    __Pyx_GIVEREF(__pyx_v_den);
    __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_7, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 989; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":980
 * 
 * 
 * cdef object _div(object num, object den, int minPrec):             # <<<<<<<<<<<<<<
 *     """Return num / den as Decimal, if possible with precision <=
 *     max(minPrec, LIMIT_PREC), otherwise as Fraction"""
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("_cdecimalfp._div", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_dec);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":992
 * 
 * 
 * cdef object add(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x + y"""
 *     cdef int p
 */

static PyObject *__pyx_f_11_cdecimalfp_add(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_x, PyObject *__pyx_v_y) {
  int __pyx_v_p;
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_result = 0;
  PyObject *__pyx_v_y_numerator = NULL;
  PyObject *__pyx_v_y_denominator = NULL;
  PyObject *__pyx_v_x_denominator = NULL;
  PyObject *__pyx_v_num = NULL;
  PyObject *__pyx_v_den = NULL;
  int __pyx_v_minPrec;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *(*__pyx_t_8)(PyObject *);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("add", 0);

  /* "_cdecimalfp.pyx":996
 *     cdef int p
 *     cdef Decimal result
 *     if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *         p = x._precision - (<Decimal>y)._precision
 *         if p == 0:
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":997
 *     cdef Decimal result
 *     if isinstance(y, Decimal):
 *         p = x._precision - (<Decimal>y)._precision             # <<<<<<<<<<<<<<
 *         if p == 0:
 *             result = Decimal(x)
 */
    __pyx_v_p = (__pyx_v_x->_precision - ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_precision);

    /* "_cdecimalfp.pyx":998
 *     if isinstance(y, Decimal):
 *         p = x._precision - (<Decimal>y)._precision
 *         if p == 0:             # <<<<<<<<<<<<<<
 *             result = Decimal(x)
 *             result._value += (<Decimal>y)._value
 */
    __pyx_t_2 = ((__pyx_v_p == 0) != 0);
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":999
 *         p = x._precision - (<Decimal>y)._precision
 *         if p == 0:
 *             result = Decimal(x)             # <<<<<<<<<<<<<<
 *             result._value += (<Decimal>y)._value
 *         elif p > 0:
 */
      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_INCREF(((PyObject *)__pyx_v_x));
      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_x));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_x));
      __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 999; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_4);
      __pyx_t_4 = 0;

      /* "_cdecimalfp.pyx":1000
 *         if p == 0:
 *             result = Decimal(x)
 *             result._value += (<Decimal>y)._value             # <<<<<<<<<<<<<<
 *         elif p > 0:
 *             result = Decimal(x)
 */
      __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_result->_value, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_value); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1000; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_v_result->_value);
      __Pyx_DECREF(__pyx_v_result->_value);
      __pyx_v_result->_value = __pyx_t_4;
      __pyx_t_4 = 0;
      goto __pyx_L4;
    }

    /* "_cdecimalfp.pyx":1001
 *             result = Decimal(x)
 *             result._value += (<Decimal>y)._value
 *         elif p > 0:             # <<<<<<<<<<<<<<
 *             result = Decimal(x)
 *             result._value += (<Decimal>y)._value * base10pow(p)
 */
    __pyx_t_2 = ((__pyx_v_p > 0) != 0);
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":1002
 *             result._value += (<Decimal>y)._value
 *         elif p > 0:
 *             result = Decimal(x)             # <<<<<<<<<<<<<<
 *             result._value += (<Decimal>y)._value * base10pow(p)
 *         else:
 */
      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_INCREF(((PyObject *)__pyx_v_x));
      PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_x));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_x));
      __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1002; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_3);
      __pyx_t_3 = 0;

      /* "_cdecimalfp.pyx":1003
 *         elif p > 0:
 *             result = Decimal(x)
 *             result._value += (<Decimal>y)._value * base10pow(p)             # <<<<<<<<<<<<<<
 *         else:
 *             result = Decimal(y)
 */
      __pyx_t_3 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_p); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_4 = PyNumber_Multiply(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_value, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_3 = PyNumber_InPlaceAdd(__pyx_v_result->_value, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1003; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_GIVEREF(__pyx_t_3);
      __Pyx_GOTREF(__pyx_v_result->_value);
      __Pyx_DECREF(__pyx_v_result->_value);
      __pyx_v_result->_value = __pyx_t_3;
      __pyx_t_3 = 0;
      goto __pyx_L4;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":1005
 *             result._value += (<Decimal>y)._value * base10pow(p)
 *         else:
 *             result = Decimal(y)             # <<<<<<<<<<<<<<
 *             result._value += x._value * base10pow(-p)
 *         return result
 */
      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_INCREF(__pyx_v_y);
      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_y);
      __Pyx_GIVEREF(__pyx_v_y);
      __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1005; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_4);
      __pyx_t_4 = 0;

      /* "_cdecimalfp.pyx":1006
 *         else:
 *             result = Decimal(y)
 *             result._value += x._value * base10pow(-p)             # <<<<<<<<<<<<<<
 *         return result
 *     elif isinstance(y, numbers.Integral):
 */
      __pyx_t_4 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_p)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_3 = PyNumber_Multiply(__pyx_v_x->_value, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_result->_value, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1006; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_GIVEREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_v_result->_value);
      __Pyx_DECREF(__pyx_v_result->_value);
      __pyx_v_result->_value = __pyx_t_4;
      __pyx_t_4 = 0;
    }
    __pyx_L4:;

    /* "_cdecimalfp.pyx":1007
 *             result = Decimal(y)
 *             result._value += x._value * base10pow(-p)
 *         return result             # <<<<<<<<<<<<<<
 *     elif isinstance(y, numbers.Integral):
 *         p = x._precision
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_result));
    __pyx_r = ((PyObject *)__pyx_v_result);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1008
 *             result._value += x._value * base10pow(-p)
 *         return result
 *     elif isinstance(y, numbers.Integral):             # <<<<<<<<<<<<<<
 *         p = x._precision
 *         result = Decimal(x)
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Integral); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_y, __pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1008; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1009
 *         return result
 *     elif isinstance(y, numbers.Integral):
 *         p = x._precision             # <<<<<<<<<<<<<<
 *         result = Decimal(x)
 *         result._value += y * base10pow(p)
 */
    __pyx_t_5 = __pyx_v_x->_precision;
    __pyx_v_p = __pyx_t_5;

    /* "_cdecimalfp.pyx":1010
 *     elif isinstance(y, numbers.Integral):
 *         p = x._precision
 *         result = Decimal(x)             # <<<<<<<<<<<<<<
 *         result._value += y * base10pow(p)
 *         return result
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(((PyObject *)__pyx_v_x));
    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_x));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_x));
    __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1010; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_4);
    __pyx_t_4 = 0;

    /* "_cdecimalfp.pyx":1011
 *         p = x._precision
 *         result = Decimal(x)
 *         result._value += y * base10pow(p)             # <<<<<<<<<<<<<<
 *         return result
 *     elif isinstance(y, numbers.Rational):
 */
    __pyx_t_4 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_p); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = PyNumber_Multiply(__pyx_v_y, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_result->_value, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1011; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_v_result->_value);
    __Pyx_DECREF(__pyx_v_result->_value);
    __pyx_v_result->_value = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "_cdecimalfp.pyx":1012
 *         result = Decimal(x)
 *         result._value += y * base10pow(p)
 *         return result             # <<<<<<<<<<<<<<
 *     elif isinstance(y, numbers.Rational):
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_result));
    __pyx_r = ((PyObject *)__pyx_v_result);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1013
 *         result._value += y * base10pow(p)
 *         return result
 *     elif isinstance(y, numbers.Rational):             # <<<<<<<<<<<<<<
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Rational); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_y, __pyx_t_3); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1013; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1014
 *         return result
 *     elif isinstance(y, numbers.Rational):
 *         y_numerator, y_denominator = (y.numerator, y.denominator)             # <<<<<<<<<<<<<<
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()
 */
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_numerator); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_denominator); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1014; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_v_y_numerator = __pyx_t_3;
    __pyx_t_3 = 0;
    __pyx_v_y_denominator = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L3;
  }

  /* "_cdecimalfp.pyx":1015
 *     elif isinstance(y, numbers.Rational):
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):             # <<<<<<<<<<<<<<
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):
 */
  __pyx_t_2 = PyFloat_Check(__pyx_v_y); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1016
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()             # <<<<<<<<<<<<<<
 *     elif isinstance(y, _StdLibDecimal):
 *         return add(x, Decimal(y))
 */
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_as_integer_ratio); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    } else {
      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
      PyObject* sequence = __pyx_t_4;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_6);
      #else
      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      #endif
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
      index = 0; __pyx_t_3 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_3);
      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_8 = NULL;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L6_unpacking_done;
      __pyx_L5_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1016; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_L6_unpacking_done:;
    }
    __pyx_v_y_numerator = __pyx_t_3;
    __pyx_t_3 = 0;
    __pyx_v_y_denominator = __pyx_t_6;
    __pyx_t_6 = 0;
    goto __pyx_L3;
  }

  /* "_cdecimalfp.pyx":1017
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):             # <<<<<<<<<<<<<<
 *         return add(x, Decimal(y))
 *     else:
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_y, __pyx_t_4); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1017; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1018
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):
 *         return add(x, Decimal(y))             # <<<<<<<<<<<<<<
 *     else:
 *         return NotImplemented
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_v_y);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_y);
    __Pyx_GIVEREF(__pyx_v_y);
    __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __pyx_f_11_cdecimalfp_add(__pyx_v_x, __pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1018; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1020
 *         return add(x, Decimal(y))
 *     else:
 *         return NotImplemented             # <<<<<<<<<<<<<<
 *     # handle Rational and float
 *     x_denominator = base10pow(x._precision)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_builtin_NotImplemented);
    __pyx_r = __pyx_builtin_NotImplemented;
    goto __pyx_L0;
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":1022
 *         return NotImplemented
 *     # handle Rational and float
 *     x_denominator = base10pow(x._precision)             # <<<<<<<<<<<<<<
 *     num = x._value * y_denominator + x_denominator * y_numerator
 *     den = y_denominator * x_denominator
 */
  __pyx_t_4 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_x->_precision); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1022; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_v_x_denominator = __pyx_t_4;
  __pyx_t_4 = 0;

  /* "_cdecimalfp.pyx":1023
 *     # handle Rational and float
 *     x_denominator = base10pow(x._precision)
 *     num = x._value * y_denominator + x_denominator * y_numerator             # <<<<<<<<<<<<<<
 *     den = y_denominator * x_denominator
 *     minPrec = x._precision
 */
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_x->_value, __pyx_v_y_denominator); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = PyNumber_Multiply(__pyx_v_x_denominator, __pyx_v_y_numerator); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_3 = PyNumber_Add(__pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1023; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_num = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "_cdecimalfp.pyx":1024
 *     x_denominator = base10pow(x._precision)
 *     num = x._value * y_denominator + x_denominator * y_numerator
 *     den = y_denominator * x_denominator             # <<<<<<<<<<<<<<
 *     minPrec = x._precision
 *     # return num / den as Decimal or as Fraction
 */
  __pyx_t_3 = PyNumber_Multiply(__pyx_v_y_denominator, __pyx_v_x_denominator); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1024; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_den = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "_cdecimalfp.pyx":1025
 *     num = x._value * y_denominator + x_denominator * y_numerator
 *     den = y_denominator * x_denominator
 *     minPrec = x._precision             # <<<<<<<<<<<<<<
 *     # return num / den as Decimal or as Fraction
 *     return _div(num, den, minPrec)
 */
  __pyx_t_5 = __pyx_v_x->_precision;
  __pyx_v_minPrec = __pyx_t_5;

  /* "_cdecimalfp.pyx":1027
 *     minPrec = x._precision
 *     # return num / den as Decimal or as Fraction
 *     return _div(num, den, minPrec)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = __pyx_f_11_cdecimalfp__div(__pyx_v_num, __pyx_v_den, __pyx_v_minPrec); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1027; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":992
 * 
 * 
 * cdef object add(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x + y"""
 *     cdef int p
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("_cdecimalfp.add", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_result);
  __Pyx_XDECREF(__pyx_v_y_numerator);
  __Pyx_XDECREF(__pyx_v_y_denominator);
  __Pyx_XDECREF(__pyx_v_x_denominator);
  __Pyx_XDECREF(__pyx_v_num);
  __Pyx_XDECREF(__pyx_v_den);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1030
 * 
 * 
 * cdef object sub(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x - y"""
 *     cdef int p
 */

static PyObject *__pyx_f_11_cdecimalfp_sub(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_x, PyObject *__pyx_v_y) {
  int __pyx_v_p;
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_result = 0;
  PyObject *__pyx_v_y_numerator = NULL;
  PyObject *__pyx_v_y_denominator = NULL;
  PyObject *__pyx_v_x_denominator = NULL;
  PyObject *__pyx_v_num = NULL;
  PyObject *__pyx_v_den = NULL;
  int __pyx_v_minPrec;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *(*__pyx_t_8)(PyObject *);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("sub", 0);

  /* "_cdecimalfp.pyx":1034
 *     cdef int p
 *     cdef Decimal result
 *     if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *         p = x._precision - (<Decimal>y)._precision
 *         if p == 0:
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1035
 *     cdef Decimal result
 *     if isinstance(y, Decimal):
 *         p = x._precision - (<Decimal>y)._precision             # <<<<<<<<<<<<<<
 *         if p == 0:
 *             result = Decimal(x)
 */
    __pyx_v_p = (__pyx_v_x->_precision - ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_precision);

    /* "_cdecimalfp.pyx":1036
 *     if isinstance(y, Decimal):
 *         p = x._precision - (<Decimal>y)._precision
 *         if p == 0:             # <<<<<<<<<<<<<<
 *             result = Decimal(x)
 *             result._value -= (<Decimal>y)._value
 */
    __pyx_t_2 = ((__pyx_v_p == 0) != 0);
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":1037
 *         p = x._precision - (<Decimal>y)._precision
 *         if p == 0:
 *             result = Decimal(x)             # <<<<<<<<<<<<<<
 *             result._value -= (<Decimal>y)._value
 *         elif p > 0:
 */
      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_INCREF(((PyObject *)__pyx_v_x));
      PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_x));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_x));
      __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1037; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_4);
      __pyx_t_4 = 0;

      /* "_cdecimalfp.pyx":1038
 *         if p == 0:
 *             result = Decimal(x)
 *             result._value -= (<Decimal>y)._value             # <<<<<<<<<<<<<<
 *         elif p > 0:
 *             result = Decimal(x)
 */
      __pyx_t_4 = PyNumber_InPlaceSubtract(__pyx_v_result->_value, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_value); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1038; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_GIVEREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_v_result->_value);
      __Pyx_DECREF(__pyx_v_result->_value);
      __pyx_v_result->_value = __pyx_t_4;
      __pyx_t_4 = 0;
      goto __pyx_L4;
    }

    /* "_cdecimalfp.pyx":1039
 *             result = Decimal(x)
 *             result._value -= (<Decimal>y)._value
 *         elif p > 0:             # <<<<<<<<<<<<<<
 *             result = Decimal(x)
 *             result._value -= (<Decimal>y)._value * base10pow(p)
 */
    __pyx_t_2 = ((__pyx_v_p > 0) != 0);
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":1040
 *             result._value -= (<Decimal>y)._value
 *         elif p > 0:
 *             result = Decimal(x)             # <<<<<<<<<<<<<<
 *             result._value -= (<Decimal>y)._value * base10pow(p)
 *         else:
 */
      __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_INCREF(((PyObject *)__pyx_v_x));
      PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_v_x));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_x));
      __pyx_t_3 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1040; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_3);
      __pyx_t_3 = 0;

      /* "_cdecimalfp.pyx":1041
 *         elif p > 0:
 *             result = Decimal(x)
 *             result._value -= (<Decimal>y)._value * base10pow(p)             # <<<<<<<<<<<<<<
 *         else:
 *             result = Decimal(y)
 */
      __pyx_t_3 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_p); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_4 = PyNumber_Multiply(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_value, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_t_3 = PyNumber_InPlaceSubtract(__pyx_v_result->_value, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1041; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __Pyx_GIVEREF(__pyx_t_3);
      __Pyx_GOTREF(__pyx_v_result->_value);
      __Pyx_DECREF(__pyx_v_result->_value);
      __pyx_v_result->_value = __pyx_t_3;
      __pyx_t_3 = 0;
      goto __pyx_L4;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":1043
 *             result._value -= (<Decimal>y)._value * base10pow(p)
 *         else:
 *             result = Decimal(y)             # <<<<<<<<<<<<<<
 *             result._value = x._value * base10pow(-p) - (<Decimal>y)._value
 *         return result
 */
      __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_INCREF(__pyx_v_y);
      PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_y);
      __Pyx_GIVEREF(__pyx_v_y);
      __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1043; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_4);
      __pyx_t_4 = 0;

      /* "_cdecimalfp.pyx":1044
 *         else:
 *             result = Decimal(y)
 *             result._value = x._value * base10pow(-p) - (<Decimal>y)._value             # <<<<<<<<<<<<<<
 *         return result
 *     elif isinstance(y, numbers.Integral):
 */
      __pyx_t_4 = __pyx_f_11_cdecimalfp_base10pow((-__pyx_v_p)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __pyx_t_3 = PyNumber_Multiply(__pyx_v_x->_value, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_4 = PyNumber_Subtract(__pyx_t_3, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_value); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1044; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
      __Pyx_GIVEREF(__pyx_t_4);
      __Pyx_GOTREF(__pyx_v_result->_value);
      __Pyx_DECREF(__pyx_v_result->_value);
      __pyx_v_result->_value = __pyx_t_4;
      __pyx_t_4 = 0;
    }
    __pyx_L4:;

    /* "_cdecimalfp.pyx":1045
 *             result = Decimal(y)
 *             result._value = x._value * base10pow(-p) - (<Decimal>y)._value
 *         return result             # <<<<<<<<<<<<<<
 *     elif isinstance(y, numbers.Integral):
 *         p = x._precision
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_result));
    __pyx_r = ((PyObject *)__pyx_v_result);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1046
 *             result._value = x._value * base10pow(-p) - (<Decimal>y)._value
 *         return result
 *     elif isinstance(y, numbers.Integral):             # <<<<<<<<<<<<<<
 *         p = x._precision
 *         result = Decimal(x)
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Integral); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_y, __pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1046; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1047
 *         return result
 *     elif isinstance(y, numbers.Integral):
 *         p = x._precision             # <<<<<<<<<<<<<<
 *         result = Decimal(x)
 *         result._value -= y * base10pow(p)
 */
    __pyx_t_5 = __pyx_v_x->_precision;
    __pyx_v_p = __pyx_t_5;

    /* "_cdecimalfp.pyx":1048
 *     elif isinstance(y, numbers.Integral):
 *         p = x._precision
 *         result = Decimal(x)             # <<<<<<<<<<<<<<
 *         result._value -= y * base10pow(p)
 *         return result
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(((PyObject *)__pyx_v_x));
    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_x));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_x));
    __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1048; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_4);
    __pyx_t_4 = 0;

    /* "_cdecimalfp.pyx":1049
 *         p = x._precision
 *         result = Decimal(x)
 *         result._value -= y * base10pow(p)             # <<<<<<<<<<<<<<
 *         return result
 *     elif isinstance(y, numbers.Rational):
 */
    __pyx_t_4 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_p); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1049; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_3 = PyNumber_Multiply(__pyx_v_y, __pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1049; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = PyNumber_InPlaceSubtract(__pyx_v_result->_value, __pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1049; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_v_result->_value);
    __Pyx_DECREF(__pyx_v_result->_value);
    __pyx_v_result->_value = __pyx_t_4;
    __pyx_t_4 = 0;

    /* "_cdecimalfp.pyx":1050
 *         result = Decimal(x)
 *         result._value -= y * base10pow(p)
 *         return result             # <<<<<<<<<<<<<<
 *     elif isinstance(y, numbers.Rational):
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_result));
    __pyx_r = ((PyObject *)__pyx_v_result);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1051
 *         result._value -= y * base10pow(p)
 *         return result
 *     elif isinstance(y, numbers.Rational):             # <<<<<<<<<<<<<<
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Rational); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_y, __pyx_t_3); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1051; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1052
 *         return result
 *     elif isinstance(y, numbers.Rational):
 *         y_numerator, y_denominator = (y.numerator, y.denominator)             # <<<<<<<<<<<<<<
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()
 */
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_numerator); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_denominator); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1052; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_v_y_numerator = __pyx_t_3;
    __pyx_t_3 = 0;
    __pyx_v_y_denominator = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L3;
  }

  /* "_cdecimalfp.pyx":1053
 *     elif isinstance(y, numbers.Rational):
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):             # <<<<<<<<<<<<<<
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):
 */
  __pyx_t_2 = PyFloat_Check(__pyx_v_y); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1054
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()             # <<<<<<<<<<<<<<
 *     elif isinstance(y, _StdLibDecimal):
 *         return sub(x, Decimal(y))
 */
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_as_integer_ratio); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    } else {
      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
      PyObject* sequence = __pyx_t_4;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_6);
      #else
      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      #endif
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
      index = 0; __pyx_t_3 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_3);
      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_8 = NULL;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L6_unpacking_done;
      __pyx_L5_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1054; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_L6_unpacking_done:;
    }
    __pyx_v_y_numerator = __pyx_t_3;
    __pyx_t_3 = 0;
    __pyx_v_y_denominator = __pyx_t_6;
    __pyx_t_6 = 0;
    goto __pyx_L3;
  }

  /* "_cdecimalfp.pyx":1055
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):             # <<<<<<<<<<<<<<
 *         return sub(x, Decimal(y))
 *     else:
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_y, __pyx_t_4); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1055; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1056
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):
 *         return sub(x, Decimal(y))             # <<<<<<<<<<<<<<
 *     else:
 *         return NotImplemented
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_INCREF(__pyx_v_y);
    PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_v_y);
    __Pyx_GIVEREF(__pyx_v_y);
    __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_4, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __pyx_t_4 = __pyx_f_11_cdecimalfp_sub(__pyx_v_x, __pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1056; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1058
 *         return sub(x, Decimal(y))
 *     else:
 *         return NotImplemented             # <<<<<<<<<<<<<<
 *     # handle Rational and float
 *     x_denominator = base10pow(x._precision)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_builtin_NotImplemented);
    __pyx_r = __pyx_builtin_NotImplemented;
    goto __pyx_L0;
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":1060
 *         return NotImplemented
 *     # handle Rational and float
 *     x_denominator = base10pow(x._precision)             # <<<<<<<<<<<<<<
 *     num = x._value * y_denominator - x_denominator * y_numerator
 *     den = y_denominator * x_denominator
 */
  __pyx_t_4 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_x->_precision); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1060; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_v_x_denominator = __pyx_t_4;
  __pyx_t_4 = 0;

  /* "_cdecimalfp.pyx":1061
 *     # handle Rational and float
 *     x_denominator = base10pow(x._precision)
 *     num = x._value * y_denominator - x_denominator * y_numerator             # <<<<<<<<<<<<<<
 *     den = y_denominator * x_denominator
 *     minPrec = x._precision
 */
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_x->_value, __pyx_v_y_denominator); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1061; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = PyNumber_Multiply(__pyx_v_x_denominator, __pyx_v_y_numerator); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1061; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_6); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1061; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_v_num = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "_cdecimalfp.pyx":1062
 *     x_denominator = base10pow(x._precision)
 *     num = x._value * y_denominator - x_denominator * y_numerator
 *     den = y_denominator * x_denominator             # <<<<<<<<<<<<<<
 *     minPrec = x._precision
 *     # return num / den as Decimal or as Fraction
 */
  __pyx_t_3 = PyNumber_Multiply(__pyx_v_y_denominator, __pyx_v_x_denominator); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1062; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_v_den = __pyx_t_3;
  __pyx_t_3 = 0;

  /* "_cdecimalfp.pyx":1063
 *     num = x._value * y_denominator - x_denominator * y_numerator
 *     den = y_denominator * x_denominator
 *     minPrec = x._precision             # <<<<<<<<<<<<<<
 *     # return num / den as Decimal or as Fraction
 *     return _div(num, den, minPrec)
 */
  __pyx_t_5 = __pyx_v_x->_precision;
  __pyx_v_minPrec = __pyx_t_5;

  /* "_cdecimalfp.pyx":1065
 *     minPrec = x._precision
 *     # return num / den as Decimal or as Fraction
 *     return _div(num, den, minPrec)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_3 = __pyx_f_11_cdecimalfp__div(__pyx_v_num, __pyx_v_den, __pyx_v_minPrec); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1065; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_r = __pyx_t_3;
  __pyx_t_3 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":1030
 * 
 * 
 * cdef object sub(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x - y"""
 *     cdef int p
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_AddTraceback("_cdecimalfp.sub", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_result);
  __Pyx_XDECREF(__pyx_v_y_numerator);
  __Pyx_XDECREF(__pyx_v_y_denominator);
  __Pyx_XDECREF(__pyx_v_x_denominator);
  __Pyx_XDECREF(__pyx_v_num);
  __Pyx_XDECREF(__pyx_v_den);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1068
 * 
 * 
 * cdef object mul(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x * y"""
 *     if isinstance(y, Decimal):
 */

static PyObject *__pyx_f_11_cdecimalfp_mul(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_x, PyObject *__pyx_v_y) {
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_result = NULL;
  PyObject *__pyx_v_y_numerator = NULL;
  PyObject *__pyx_v_y_denominator = NULL;
  PyObject *__pyx_v_num = NULL;
  PyObject *__pyx_v_den = NULL;
  int __pyx_v_minPrec;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *(*__pyx_t_8)(PyObject *);
  PyObject *__pyx_t_9 = NULL;
  int __pyx_t_10;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("mul", 0);

  /* "_cdecimalfp.pyx":1070
 * cdef object mul(Decimal x, object y):
 *     """x * y"""
 *     if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *         result = Decimal(x)
 *         (<Decimal>result)._value *= (<Decimal>y)._value
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1071
 *     """x * y"""
 *     if isinstance(y, Decimal):
 *         result = Decimal(x)             # <<<<<<<<<<<<<<
 *         (<Decimal>result)._value *= (<Decimal>y)._value
 *         (<Decimal>result)._precision += (<Decimal>y)._precision
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(((PyObject *)__pyx_v_x));
    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_x));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_x));
    __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1071; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_4);
    __pyx_t_4 = 0;

    /* "_cdecimalfp.pyx":1072
 *     if isinstance(y, Decimal):
 *         result = Decimal(x)
 *         (<Decimal>result)._value *= (<Decimal>y)._value             # <<<<<<<<<<<<<<
 *         (<Decimal>result)._precision += (<Decimal>y)._precision
 *         return result
 */
    __Pyx_INCREF(((PyObject *)((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_result)));
    __pyx_t_5 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_result);
    __pyx_t_4 = PyNumber_InPlaceMultiply(__pyx_t_5->_value, ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_value); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1072; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_t_5->_value);
    __Pyx_DECREF(__pyx_t_5->_value);
    __pyx_t_5->_value = __pyx_t_4;
    __pyx_t_4 = 0;
    __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1073
 *         result = Decimal(x)
 *         (<Decimal>result)._value *= (<Decimal>y)._value
 *         (<Decimal>result)._precision += (<Decimal>y)._precision             # <<<<<<<<<<<<<<
 *         return result
 *     elif isinstance(y, numbers.Integral):
 */
    __Pyx_INCREF(((PyObject *)((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_result)));
    __pyx_t_5 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_result);
    __pyx_t_5->_precision = (__pyx_t_5->_precision + ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_precision);
    __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1074
 *         (<Decimal>result)._value *= (<Decimal>y)._value
 *         (<Decimal>result)._precision += (<Decimal>y)._precision
 *         return result             # <<<<<<<<<<<<<<
 *     elif isinstance(y, numbers.Integral):
 *         result = Decimal(x)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_result));
    __pyx_r = ((PyObject *)__pyx_v_result);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1075
 *         (<Decimal>result)._precision += (<Decimal>y)._precision
 *         return result
 *     elif isinstance(y, numbers.Integral):             # <<<<<<<<<<<<<<
 *         result = Decimal(x)
 *         (<Decimal>result)._value *= y
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Integral); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_y, __pyx_t_3); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1075; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1076
 *         return result
 *     elif isinstance(y, numbers.Integral):
 *         result = Decimal(x)             # <<<<<<<<<<<<<<
 *         (<Decimal>result)._value *= y
 *         return result
 */
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(((PyObject *)__pyx_v_x));
    PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_x));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_x));
    __pyx_t_4 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1076; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_4);
    __pyx_t_4 = 0;

    /* "_cdecimalfp.pyx":1077
 *     elif isinstance(y, numbers.Integral):
 *         result = Decimal(x)
 *         (<Decimal>result)._value *= y             # <<<<<<<<<<<<<<
 *         return result
 *     elif isinstance(y, numbers.Rational):
 */
    __Pyx_INCREF(((PyObject *)((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_result)));
    __pyx_t_5 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_result);
    __pyx_t_4 = PyNumber_InPlaceMultiply(__pyx_t_5->_value, __pyx_v_y); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1077; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_GIVEREF(__pyx_t_4);
    __Pyx_GOTREF(__pyx_t_5->_value);
    __Pyx_DECREF(__pyx_t_5->_value);
    __pyx_t_5->_value = __pyx_t_4;
    __pyx_t_4 = 0;
    __Pyx_DECREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1078
 *         result = Decimal(x)
 *         (<Decimal>result)._value *= y
 *         return result             # <<<<<<<<<<<<<<
 *     elif isinstance(y, numbers.Rational):
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(((PyObject *)__pyx_v_result));
    __pyx_r = ((PyObject *)__pyx_v_result);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1079
 *         (<Decimal>result)._value *= y
 *         return result
 *     elif isinstance(y, numbers.Rational):             # <<<<<<<<<<<<<<
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_Rational); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_y, __pyx_t_3); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1079; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1080
 *         return result
 *     elif isinstance(y, numbers.Rational):
 *         y_numerator, y_denominator = (y.numerator, y.denominator)             # <<<<<<<<<<<<<<
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()
 */
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_numerator); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_denominator); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1080; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_v_y_numerator = __pyx_t_3;
    __pyx_t_3 = 0;
    __pyx_v_y_denominator = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L3;
  }

  /* "_cdecimalfp.pyx":1081
 *     elif isinstance(y, numbers.Rational):
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):             # <<<<<<<<<<<<<<
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):
 */
  __pyx_t_2 = PyFloat_Check(__pyx_v_y); 
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1082
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()             # <<<<<<<<<<<<<<
 *     elif isinstance(y, _StdLibDecimal):
 *         return x.__mul__(Decimal(y))
 */
    __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_as_integer_ratio); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __pyx_t_6 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_3))) {
      __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_3);
      if (likely(__pyx_t_6)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3);
        __Pyx_INCREF(__pyx_t_6);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_3, function);
      }
    }
    if (__pyx_t_6) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_6); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    } else {
      __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_3); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    if ((likely(PyTuple_CheckExact(__pyx_t_4))) || (PyList_CheckExact(__pyx_t_4))) {
      PyObject* sequence = __pyx_t_4;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_3 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_6 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_3);
      __Pyx_INCREF(__pyx_t_6);
      #else
      __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_3);
      __pyx_t_6 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      #endif
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_7 = PyObject_GetIter(__pyx_t_4); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_7);
      __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
      __pyx_t_8 = Py_TYPE(__pyx_t_7)->tp_iternext;
      index = 0; __pyx_t_3 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_3)) goto __pyx_L4_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_3);
      index = 1; __pyx_t_6 = __pyx_t_8(__pyx_t_7); if (unlikely(!__pyx_t_6)) goto __pyx_L4_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_8(__pyx_t_7), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_8 = NULL;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      goto __pyx_L5_unpacking_done;
      __pyx_L4_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __pyx_t_8 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1082; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_L5_unpacking_done:;
    }
    __pyx_v_y_numerator = __pyx_t_3;
    __pyx_t_3 = 0;
    __pyx_v_y_denominator = __pyx_t_6;
    __pyx_t_6 = 0;
    goto __pyx_L3;
  }

  /* "_cdecimalfp.pyx":1083
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):             # <<<<<<<<<<<<<<
 *         return x.__mul__(Decimal(y))
 *     else:
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1083; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_y, __pyx_t_4); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1083; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1084
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):
 *         return x.__mul__(Decimal(y))             # <<<<<<<<<<<<<<
 *     else:
 *         return NotImplemented
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_x), __pyx_n_s_mul); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_INCREF(__pyx_v_y);
    PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_y);
    __Pyx_GIVEREF(__pyx_v_y);
    __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_3, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
    __pyx_t_3 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
      __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_6);
      if (likely(__pyx_t_3)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
        __Pyx_INCREF(__pyx_t_3);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_6, function);
      }
    }
    if (!__pyx_t_3) {
      __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_7); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
      __Pyx_GOTREF(__pyx_t_4);
    } else {
      __pyx_t_9 = PyTuple_New(1+1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = NULL;
      PyTuple_SET_ITEM(__pyx_t_9, 0+1, __pyx_t_7);
      __Pyx_GIVEREF(__pyx_t_7);
      __pyx_t_7 = 0;
      __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_9, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1084; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_4);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    }
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_r = __pyx_t_4;
    __pyx_t_4 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1086
 *         return x.__mul__(Decimal(y))
 *     else:
 *         return NotImplemented             # <<<<<<<<<<<<<<
 *     # handle Rational and float
 *     num = x._value * y_numerator
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_builtin_NotImplemented);
    __pyx_r = __pyx_builtin_NotImplemented;
    goto __pyx_L0;
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":1088
 *         return NotImplemented
 *     # handle Rational and float
 *     num = x._value * y_numerator             # <<<<<<<<<<<<<<
 *     den = y_denominator * base10pow(x._precision)
 *     minPrec = x._precision
 */
  __pyx_t_4 = PyNumber_Multiply(__pyx_v_x->_value, __pyx_v_y_numerator); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1088; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_v_num = __pyx_t_4;
  __pyx_t_4 = 0;

  /* "_cdecimalfp.pyx":1089
 *     # handle Rational and float
 *     num = x._value * y_numerator
 *     den = y_denominator * base10pow(x._precision)             # <<<<<<<<<<<<<<
 *     minPrec = x._precision
 *     # return num / den as Decimal or as Fraction
 */
  __pyx_t_4 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_x->_precision); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_6 = PyNumber_Multiply(__pyx_v_y_denominator, __pyx_t_4); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1089; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_v_den = __pyx_t_6;
  __pyx_t_6 = 0;

  /* "_cdecimalfp.pyx":1090
 *     num = x._value * y_numerator
 *     den = y_denominator * base10pow(x._precision)
 *     minPrec = x._precision             # <<<<<<<<<<<<<<
 *     # return num / den as Decimal or as Fraction
 *     return _div(num, den, minPrec)
 */
  __pyx_t_10 = __pyx_v_x->_precision;
  __pyx_v_minPrec = __pyx_t_10;

  /* "_cdecimalfp.pyx":1092
 *     minPrec = x._precision
 *     # return num / den as Decimal or as Fraction
 *     return _div(num, den, minPrec)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_6 = __pyx_f_11_cdecimalfp__div(__pyx_v_num, __pyx_v_den, __pyx_v_minPrec); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1092; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_r = __pyx_t_6;
  __pyx_t_6 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":1068
 * 
 * 
 * cdef object mul(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x * y"""
 *     if isinstance(y, Decimal):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(((PyObject *)__pyx_t_5));
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("_cdecimalfp.mul", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_result);
  __Pyx_XDECREF(__pyx_v_y_numerator);
  __Pyx_XDECREF(__pyx_v_y_denominator);
  __Pyx_XDECREF(__pyx_v_num);
  __Pyx_XDECREF(__pyx_v_den);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1095
 * 
 * 
 * cdef object div1(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x / y"""
 *     cdef int xp, yp
 */

static PyObject *__pyx_f_11_cdecimalfp_div1(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_x, PyObject *__pyx_v_y) {
  int __pyx_v_xp;
  int __pyx_v_yp;
  PyObject *__pyx_v_num = NULL;
  PyObject *__pyx_v_den = NULL;
  int __pyx_v_minPrec;
  PyObject *__pyx_v_y_numerator = NULL;
  PyObject *__pyx_v_y_denominator = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *(*__pyx_t_10)(PyObject *);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("div1", 0);

  /* "_cdecimalfp.pyx":1098
 *     """x / y"""
 *     cdef int xp, yp
 *     if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *         xp, yp = x._precision, (<Decimal>y)._precision
 *         num = x._value * base10pow(yp)
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1099
 *     cdef int xp, yp
 *     if isinstance(y, Decimal):
 *         xp, yp = x._precision, (<Decimal>y)._precision             # <<<<<<<<<<<<<<
 *         num = x._value * base10pow(yp)
 *         den = (<Decimal>y)._value * base10pow(xp)
 */
    __pyx_t_3 = __pyx_v_x->_precision;
    __pyx_t_4 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_precision;
    __pyx_v_xp = __pyx_t_3;
    __pyx_v_yp = __pyx_t_4;

    /* "_cdecimalfp.pyx":1100
 *     if isinstance(y, Decimal):
 *         xp, yp = x._precision, (<Decimal>y)._precision
 *         num = x._value * base10pow(yp)             # <<<<<<<<<<<<<<
 *         den = (<Decimal>y)._value * base10pow(xp)
 *         minPrec = max(xp, yp)
 */
    __pyx_t_5 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_yp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PyNumber_Multiply(__pyx_v_x->_value, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1100; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_v_num = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "_cdecimalfp.pyx":1101
 *         xp, yp = x._precision, (<Decimal>y)._precision
 *         num = x._value * base10pow(yp)
 *         den = (<Decimal>y)._value * base10pow(xp)             # <<<<<<<<<<<<<<
 *         minPrec = max(xp, yp)
 *         # return num / den as Decimal or as Fraction
 */
    __pyx_t_6 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_xp); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = PyNumber_Multiply(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_value, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1101; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_den = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1102
 *         num = x._value * base10pow(yp)
 *         den = (<Decimal>y)._value * base10pow(xp)
 *         minPrec = max(xp, yp)             # <<<<<<<<<<<<<<
 *         # return num / den as Decimal or as Fraction
 *         return _div(num, den, minPrec)
 */
    __pyx_t_4 = __pyx_v_yp;
    __pyx_t_3 = __pyx_v_xp;
    if (((__pyx_t_4 > __pyx_t_3) != 0)) {
      __pyx_t_7 = __pyx_t_4;
    } else {
      __pyx_t_7 = __pyx_t_3;
    }
    __pyx_v_minPrec = __pyx_t_7;

    /* "_cdecimalfp.pyx":1104
 *         minPrec = max(xp, yp)
 *         # return num / den as Decimal or as Fraction
 *         return _div(num, den, minPrec)             # <<<<<<<<<<<<<<
 *     elif isinstance(y, numbers.Rational):       # includes Integral
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = __pyx_f_11_cdecimalfp__div(__pyx_v_num, __pyx_v_den, __pyx_v_minPrec); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1104; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1105
 *         # return num / den as Decimal or as Fraction
 *         return _div(num, den, minPrec)
 *     elif isinstance(y, numbers.Rational):       # includes Integral             # <<<<<<<<<<<<<<
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Rational); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_y, __pyx_t_6); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1105; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1106
 *         return _div(num, den, minPrec)
 *     elif isinstance(y, numbers.Rational):       # includes Integral
 *         y_numerator, y_denominator = (y.numerator, y.denominator)             # <<<<<<<<<<<<<<
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()
 */
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_numerator); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_denominator); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1106; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_v_y_numerator = __pyx_t_6;
    __pyx_t_6 = 0;
    __pyx_v_y_denominator = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L3;
  }

  /* "_cdecimalfp.pyx":1107
 *     elif isinstance(y, numbers.Rational):       # includes Integral
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):             # <<<<<<<<<<<<<<
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):
 */
  __pyx_t_1 = PyFloat_Check(__pyx_v_y); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1108
 *         y_numerator, y_denominator = (y.numerator, y.denominator)
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()             # <<<<<<<<<<<<<<
 *     elif isinstance(y, _StdLibDecimal):
 *         return div1(x, Decimal(y))
 */
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_as_integer_ratio); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_6);
      if (likely(__pyx_t_8)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
        __Pyx_INCREF(__pyx_t_8);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_6, function);
      }
    }
    if (__pyx_t_8) {
      __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_8); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    } else {
      __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
      PyObject* sequence = __pyx_t_5;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_8);
      #else
      __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_8 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      #endif
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_9 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_10 = Py_TYPE(__pyx_t_9)->tp_iternext;
      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L4_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      index = 1; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L4_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_8);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_9), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_10 = NULL;
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      goto __pyx_L5_unpacking_done;
      __pyx_L4_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_10 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1108; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_L5_unpacking_done:;
    }
    __pyx_v_y_numerator = __pyx_t_6;
    __pyx_t_6 = 0;
    __pyx_v_y_denominator = __pyx_t_8;
    __pyx_t_8 = 0;
    goto __pyx_L3;
  }

  /* "_cdecimalfp.pyx":1109
 *     elif isinstance(y, float):
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):             # <<<<<<<<<<<<<<
 *         return div1(x, Decimal(y))
 *     else:
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_y, __pyx_t_5); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1109; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1110
 *         y_numerator, y_denominator = y.as_integer_ratio()
 *     elif isinstance(y, _StdLibDecimal):
 *         return div1(x, Decimal(y))             # <<<<<<<<<<<<<<
 *     else:
 *         return NotImplemented
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_v_y);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_y);
    __Pyx_GIVEREF(__pyx_v_y);
    __pyx_t_8 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = __pyx_f_11_cdecimalfp_div1(__pyx_v_x, __pyx_t_8); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1110; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1112
 *         return div1(x, Decimal(y))
 *     else:
 *         return NotImplemented             # <<<<<<<<<<<<<<
 *     # handle Rational and float
 *     num = x._value * y_denominator
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_builtin_NotImplemented);
    __pyx_r = __pyx_builtin_NotImplemented;
    goto __pyx_L0;
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":1114
 *         return NotImplemented
 *     # handle Rational and float
 *     num = x._value * y_denominator             # <<<<<<<<<<<<<<
 *     den = y_numerator * base10pow(x._precision)
 *     minPrec = x._precision
 */
  __pyx_t_5 = PyNumber_Multiply(__pyx_v_x->_value, __pyx_v_y_denominator); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1114; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_v_num = __pyx_t_5;
  __pyx_t_5 = 0;

  /* "_cdecimalfp.pyx":1115
 *     # handle Rational and float
 *     num = x._value * y_denominator
 *     den = y_numerator * base10pow(x._precision)             # <<<<<<<<<<<<<<
 *     minPrec = x._precision
 *     # return num / den as Decimal or as Fraction
 */
  __pyx_t_5 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_x->_precision); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_8 = PyNumber_Multiply(__pyx_v_y_numerator, __pyx_t_5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1115; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_den = __pyx_t_8;
  __pyx_t_8 = 0;

  /* "_cdecimalfp.pyx":1116
 *     num = x._value * y_denominator
 *     den = y_numerator * base10pow(x._precision)
 *     minPrec = x._precision             # <<<<<<<<<<<<<<
 *     # return num / den as Decimal or as Fraction
 *     return _div(num, den, minPrec)
 */
  __pyx_t_7 = __pyx_v_x->_precision;
  __pyx_v_minPrec = __pyx_t_7;

  /* "_cdecimalfp.pyx":1118
 *     minPrec = x._precision
 *     # return num / den as Decimal or as Fraction
 *     return _div(num, den, minPrec)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_8 = __pyx_f_11_cdecimalfp__div(__pyx_v_num, __pyx_v_den, __pyx_v_minPrec); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1118; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_r = __pyx_t_8;
  __pyx_t_8 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":1095
 * 
 * 
 * cdef object div1(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x / y"""
 *     cdef int xp, yp
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("_cdecimalfp.div1", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_num);
  __Pyx_XDECREF(__pyx_v_den);
  __Pyx_XDECREF(__pyx_v_y_numerator);
  __Pyx_XDECREF(__pyx_v_y_denominator);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1121
 * 
 * 
 * cdef object div2(object x, Decimal y):             # <<<<<<<<<<<<<<
 *     """x / y"""
 *     cdef int xp, yp
 */

static PyObject *__pyx_f_11_cdecimalfp_div2(PyObject *__pyx_v_x, struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_y) {
  int __pyx_v_xp;
  int __pyx_v_yp;
  PyObject *__pyx_v_num = NULL;
  PyObject *__pyx_v_den = NULL;
  int __pyx_v_minPrec;
  PyObject *__pyx_v_x_numerator = NULL;
  PyObject *__pyx_v_x_denominator = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  int __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  PyObject *(*__pyx_t_10)(PyObject *);
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("div2", 0);

  /* "_cdecimalfp.pyx":1124
 *     """x / y"""
 *     cdef int xp, yp
 *     if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *         xp, yp = (<Decimal>x)._precision, y._precision
 *         num = (<Decimal>x)._value * base10pow(yp)
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1125
 *     cdef int xp, yp
 *     if isinstance(x, Decimal):
 *         xp, yp = (<Decimal>x)._precision, y._precision             # <<<<<<<<<<<<<<
 *         num = (<Decimal>x)._value * base10pow(yp)
 *         den = y._value * base10pow(xp)
 */
    __pyx_t_3 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x)->_precision;
    __pyx_t_4 = __pyx_v_y->_precision;
    __pyx_v_xp = __pyx_t_3;
    __pyx_v_yp = __pyx_t_4;

    /* "_cdecimalfp.pyx":1126
 *     if isinstance(x, Decimal):
 *         xp, yp = (<Decimal>x)._precision, y._precision
 *         num = (<Decimal>x)._value * base10pow(yp)             # <<<<<<<<<<<<<<
 *         den = y._value * base10pow(xp)
 *         minPrec = max(xp, yp)
 */
    __pyx_t_5 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_yp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PyNumber_Multiply(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x)->_value, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1126; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_v_num = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "_cdecimalfp.pyx":1127
 *         xp, yp = (<Decimal>x)._precision, y._precision
 *         num = (<Decimal>x)._value * base10pow(yp)
 *         den = y._value * base10pow(xp)             # <<<<<<<<<<<<<<
 *         minPrec = max(xp, yp)
 *         # return num / den as Decimal or as Fraction
 */
    __pyx_t_6 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_xp); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = PyNumber_Multiply(__pyx_v_y->_value, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1127; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_den = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1128
 *         num = (<Decimal>x)._value * base10pow(yp)
 *         den = y._value * base10pow(xp)
 *         minPrec = max(xp, yp)             # <<<<<<<<<<<<<<
 *         # return num / den as Decimal or as Fraction
 *         return _div(num, den, minPrec)
 */
    __pyx_t_4 = __pyx_v_yp;
    __pyx_t_3 = __pyx_v_xp;
    if (((__pyx_t_4 > __pyx_t_3) != 0)) {
      __pyx_t_7 = __pyx_t_4;
    } else {
      __pyx_t_7 = __pyx_t_3;
    }
    __pyx_v_minPrec = __pyx_t_7;

    /* "_cdecimalfp.pyx":1130
 *         minPrec = max(xp, yp)
 *         # return num / den as Decimal or as Fraction
 *         return _div(num, den, minPrec)             # <<<<<<<<<<<<<<
 *     if isinstance(x, numbers.Rational):
 *         x_numerator, x_denominator = (x.numerator, x.denominator)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = __pyx_f_11_cdecimalfp__div(__pyx_v_num, __pyx_v_den, __pyx_v_minPrec); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1130; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1131
 *         # return num / den as Decimal or as Fraction
 *         return _div(num, den, minPrec)
 *     if isinstance(x, numbers.Rational):             # <<<<<<<<<<<<<<
 *         x_numerator, x_denominator = (x.numerator, x.denominator)
 *     elif isinstance(x, float):
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Rational); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_x, __pyx_t_6); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1131; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1132
 *         return _div(num, den, minPrec)
 *     if isinstance(x, numbers.Rational):
 *         x_numerator, x_denominator = (x.numerator, x.denominator)             # <<<<<<<<<<<<<<
 *     elif isinstance(x, float):
 *         x_numerator, x_denominator = x.as_integer_ratio()
 */
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_x, __pyx_n_s_numerator); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_x, __pyx_n_s_denominator); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1132; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_v_x_numerator = __pyx_t_6;
    __pyx_t_6 = 0;
    __pyx_v_x_denominator = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L4;
  }

  /* "_cdecimalfp.pyx":1133
 *     if isinstance(x, numbers.Rational):
 *         x_numerator, x_denominator = (x.numerator, x.denominator)
 *     elif isinstance(x, float):             # <<<<<<<<<<<<<<
 *         x_numerator, x_denominator = x.as_integer_ratio()
 *     elif isinstance(x, _StdLibDecimal):
 */
  __pyx_t_1 = PyFloat_Check(__pyx_v_x); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1134
 *         x_numerator, x_denominator = (x.numerator, x.denominator)
 *     elif isinstance(x, float):
 *         x_numerator, x_denominator = x.as_integer_ratio()             # <<<<<<<<<<<<<<
 *     elif isinstance(x, _StdLibDecimal):
 *         return div1(Decimal(x), y)
 */
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_v_x, __pyx_n_s_as_integer_ratio); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_6))) {
      __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_6);
      if (likely(__pyx_t_8)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
        __Pyx_INCREF(__pyx_t_8);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_6, function);
      }
    }
    if (__pyx_t_8) {
      __pyx_t_5 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_8); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    } else {
      __pyx_t_5 = __Pyx_PyObject_CallNoArg(__pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    if ((likely(PyTuple_CheckExact(__pyx_t_5))) || (PyList_CheckExact(__pyx_t_5))) {
      PyObject* sequence = __pyx_t_5;
      #if CYTHON_COMPILING_IN_CPYTHON
      Py_ssize_t size = Py_SIZE(sequence);
      #else
      Py_ssize_t size = PySequence_Size(sequence);
      #endif
      if (unlikely(size != 2)) {
        if (size > 2) __Pyx_RaiseTooManyValuesError(2);
        else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size);
        {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      }
      #if CYTHON_COMPILING_IN_CPYTHON
      if (likely(PyTuple_CheckExact(sequence))) {
        __pyx_t_6 = PyTuple_GET_ITEM(sequence, 0); 
        __pyx_t_8 = PyTuple_GET_ITEM(sequence, 1); 
      } else {
        __pyx_t_6 = PyList_GET_ITEM(sequence, 0); 
        __pyx_t_8 = PyList_GET_ITEM(sequence, 1); 
      }
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(__pyx_t_8);
      #else
      __pyx_t_6 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_8 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      #endif
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else {
      Py_ssize_t index = -1;
      __pyx_t_9 = PyObject_GetIter(__pyx_t_5); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_t_10 = Py_TYPE(__pyx_t_9)->tp_iternext;
      index = 0; __pyx_t_6 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_6)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_6);
      index = 1; __pyx_t_8 = __pyx_t_10(__pyx_t_9); if (unlikely(!__pyx_t_8)) goto __pyx_L5_unpacking_failed;
      __Pyx_GOTREF(__pyx_t_8);
      if (__Pyx_IternextUnpackEndCheck(__pyx_t_10(__pyx_t_9), 2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_10 = NULL;
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      goto __pyx_L6_unpacking_done;
      __pyx_L5_unpacking_failed:;
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
      __pyx_t_10 = NULL;
      if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index);
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1134; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_L6_unpacking_done:;
    }
    __pyx_v_x_numerator = __pyx_t_6;
    __pyx_t_6 = 0;
    __pyx_v_x_denominator = __pyx_t_8;
    __pyx_t_8 = 0;
    goto __pyx_L4;
  }

  /* "_cdecimalfp.pyx":1135
 *     elif isinstance(x, float):
 *         x_numerator, x_denominator = x.as_integer_ratio()
 *     elif isinstance(x, _StdLibDecimal):             # <<<<<<<<<<<<<<
 *         return div1(Decimal(x), y)
 *     else:
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_x, __pyx_t_5); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1135; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1136
 *         x_numerator, x_denominator = x.as_integer_ratio()
 *     elif isinstance(x, _StdLibDecimal):
 *         return div1(Decimal(x), y)             # <<<<<<<<<<<<<<
 *     else:
 *         return NotImplemented
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_v_x);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_x);
    __Pyx_GIVEREF(__pyx_v_x);
    __pyx_t_8 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = __pyx_f_11_cdecimalfp_div1(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_8), ((PyObject *)__pyx_v_y)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1136; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_r = __pyx_t_5;
    __pyx_t_5 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1138
 *         return div1(Decimal(x), y)
 *     else:
 *         return NotImplemented             # <<<<<<<<<<<<<<
 *     # handle Rational and float
 *     num = x_numerator * base10pow(y._precision)
 */
    __Pyx_XDECREF(__pyx_r);
    __Pyx_INCREF(__pyx_builtin_NotImplemented);
    __pyx_r = __pyx_builtin_NotImplemented;
    goto __pyx_L0;
  }
  __pyx_L4:;

  /* "_cdecimalfp.pyx":1140
 *         return NotImplemented
 *     # handle Rational and float
 *     num = x_numerator * base10pow(y._precision)             # <<<<<<<<<<<<<<
 *     den = y._value * x_denominator
 *     minPrec = y._precision
 */
  __pyx_t_5 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_y->_precision); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_8 = PyNumber_Multiply(__pyx_v_x_numerator, __pyx_t_5); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1140; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_v_num = __pyx_t_8;
  __pyx_t_8 = 0;

  /* "_cdecimalfp.pyx":1141
 *     # handle Rational and float
 *     num = x_numerator * base10pow(y._precision)
 *     den = y._value * x_denominator             # <<<<<<<<<<<<<<
 *     minPrec = y._precision
 *     # return num / den as Decimal or as Fraction
 */
  __pyx_t_8 = PyNumber_Multiply(__pyx_v_y->_value, __pyx_v_x_denominator); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_v_den = __pyx_t_8;
  __pyx_t_8 = 0;

  /* "_cdecimalfp.pyx":1142
 *     num = x_numerator * base10pow(y._precision)
 *     den = y._value * x_denominator
 *     minPrec = y._precision             # <<<<<<<<<<<<<<
 *     # return num / den as Decimal or as Fraction
 *     return _div(num, den, minPrec)
 */
  __pyx_t_7 = __pyx_v_y->_precision;
  __pyx_v_minPrec = __pyx_t_7;

  /* "_cdecimalfp.pyx":1144
 *     minPrec = y._precision
 *     # return num / den as Decimal or as Fraction
 *     return _div(num, den, minPrec)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_8 = __pyx_f_11_cdecimalfp__div(__pyx_v_num, __pyx_v_den, __pyx_v_minPrec); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1144; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __pyx_r = __pyx_t_8;
  __pyx_t_8 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":1121
 * 
 * 
 * cdef object div2(object x, Decimal y):             # <<<<<<<<<<<<<<
 *     """x / y"""
 *     cdef int xp, yp
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("_cdecimalfp.div2", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_num);
  __Pyx_XDECREF(__pyx_v_den);
  __Pyx_XDECREF(__pyx_v_x_numerator);
  __Pyx_XDECREF(__pyx_v_x_denominator);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1147
 * 
 * 
 * cdef tuple divmod1(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x // y, x % y"""
 *     cdef int xp, yp
 */

static PyObject *__pyx_f_11_cdecimalfp_divmod1(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_x, PyObject *__pyx_v_y) {
  int __pyx_v_xp;
  int __pyx_v_yp;
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_r = 0;
  PyObject *__pyx_v_xv = NULL;
  PyObject *__pyx_v_yv = NULL;
  PyObject *__pyx_v_q = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  PyObject *__pyx_t_9 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("divmod1", 0);

  /* "_cdecimalfp.pyx":1151
 *     cdef int xp, yp
 *     cdef Decimal r
 *     if isinstance(y, Decimal):             # <<<<<<<<<<<<<<
 *         xp, yp = x._precision, (<Decimal>y)._precision
 *         if xp >= yp:
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1152
 *     cdef Decimal r
 *     if isinstance(y, Decimal):
 *         xp, yp = x._precision, (<Decimal>y)._precision             # <<<<<<<<<<<<<<
 *         if xp >= yp:
 *             r = Decimal(x)
 */
    __pyx_t_3 = __pyx_v_x->_precision;
    __pyx_t_4 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_precision;
    __pyx_v_xp = __pyx_t_3;
    __pyx_v_yp = __pyx_t_4;

    /* "_cdecimalfp.pyx":1153
 *     if isinstance(y, Decimal):
 *         xp, yp = x._precision, (<Decimal>y)._precision
 *         if xp >= yp:             # <<<<<<<<<<<<<<
 *             r = Decimal(x)
 *             xv = x._value
 */
    __pyx_t_2 = ((__pyx_v_xp >= __pyx_v_yp) != 0);
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":1154
 *         xp, yp = x._precision, (<Decimal>y)._precision
 *         if xp >= yp:
 *             r = Decimal(x)             # <<<<<<<<<<<<<<
 *             xv = x._value
 *             yv = (<Decimal>y)._value * base10pow(xp - yp)
 */
      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF(((PyObject *)__pyx_v_x));
      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_x));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_x));
      __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1154; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_v_r = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_6);
      __pyx_t_6 = 0;

      /* "_cdecimalfp.pyx":1155
 *         if xp >= yp:
 *             r = Decimal(x)
 *             xv = x._value             # <<<<<<<<<<<<<<
 *             yv = (<Decimal>y)._value * base10pow(xp - yp)
 *         else:
 */
      __pyx_t_6 = __pyx_v_x->_value;
      __Pyx_INCREF(__pyx_t_6);
      __pyx_v_xv = __pyx_t_6;
      __pyx_t_6 = 0;

      /* "_cdecimalfp.pyx":1156
 *             r = Decimal(x)
 *             xv = x._value
 *             yv = (<Decimal>y)._value * base10pow(xp - yp)             # <<<<<<<<<<<<<<
 *         else:
 *             r = Decimal(y)
 */
      __pyx_t_6 = __pyx_f_11_cdecimalfp_base10pow((__pyx_v_xp - __pyx_v_yp)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_5 = PyNumber_Multiply(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_value, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1156; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_v_yv = __pyx_t_5;
      __pyx_t_5 = 0;
      goto __pyx_L4;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":1158
 *             yv = (<Decimal>y)._value * base10pow(xp - yp)
 *         else:
 *             r = Decimal(y)             # <<<<<<<<<<<<<<
 *             xv = x._value * base10pow(yp - xp)
 *             yv = (<Decimal>y)._value
 */
      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF(__pyx_v_y);
      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_y);
      __Pyx_GIVEREF(__pyx_v_y);
      __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1158; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_v_r = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_6);
      __pyx_t_6 = 0;

      /* "_cdecimalfp.pyx":1159
 *         else:
 *             r = Decimal(y)
 *             xv = x._value * base10pow(yp - xp)             # <<<<<<<<<<<<<<
 *             yv = (<Decimal>y)._value
 *         q = xv // yv
 */
      __pyx_t_6 = __pyx_f_11_cdecimalfp_base10pow((__pyx_v_yp - __pyx_v_xp)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_5 = PyNumber_Multiply(__pyx_v_x->_value, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1159; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_v_xv = __pyx_t_5;
      __pyx_t_5 = 0;

      /* "_cdecimalfp.pyx":1160
 *             r = Decimal(y)
 *             xv = x._value * base10pow(yp - xp)
 *             yv = (<Decimal>y)._value             # <<<<<<<<<<<<<<
 *         q = xv // yv
 *         r._value = xv - q * yv
 */
      __pyx_t_5 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_y)->_value;
      __Pyx_INCREF(__pyx_t_5);
      __pyx_v_yv = __pyx_t_5;
      __pyx_t_5 = 0;
    }
    __pyx_L4:;

    /* "_cdecimalfp.pyx":1161
 *             xv = x._value * base10pow(yp - xp)
 *             yv = (<Decimal>y)._value
 *         q = xv // yv             # <<<<<<<<<<<<<<
 *         r._value = xv - q * yv
 *         return Decimal(q, r._precision), r
 */
    __pyx_t_5 = PyNumber_FloorDivide(__pyx_v_xv, __pyx_v_yv); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1161; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_v_q = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1162
 *             yv = (<Decimal>y)._value
 *         q = xv // yv
 *         r._value = xv - q * yv             # <<<<<<<<<<<<<<
 *         return Decimal(q, r._precision), r
 *     elif isinstance(y, numbers.Integral):
 */
    __pyx_t_5 = PyNumber_Multiply(__pyx_v_q, __pyx_v_yv); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PyNumber_Subtract(__pyx_v_xv, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1162; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GIVEREF(__pyx_t_6);
    __Pyx_GOTREF(__pyx_v_r->_value);
    __Pyx_DECREF(__pyx_v_r->_value);
    __pyx_v_r->_value = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "_cdecimalfp.pyx":1163
 *         q = xv // yv
 *         r._value = xv - q * yv
 *         return Decimal(q, r._precision), r             # <<<<<<<<<<<<<<
 *     elif isinstance(y, numbers.Integral):
 *         r = Decimal(x)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_r->_precision); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_v_q);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_q);
    __Pyx_GIVEREF(__pyx_v_q);
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1163; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_6);
    __Pyx_INCREF(((PyObject *)__pyx_v_r));
    PyTuple_SET_ITEM(__pyx_t_5, 1, ((PyObject *)__pyx_v_r));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_r));
    __pyx_t_6 = 0;
    __pyx_r = ((PyObject*)__pyx_t_5);
    __pyx_t_5 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1164
 *         r._value = xv - q * yv
 *         return Decimal(q, r._precision), r
 *     elif isinstance(y, numbers.Integral):             # <<<<<<<<<<<<<<
 *         r = Decimal(x)
 *         xv = x._value
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Integral); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_y, __pyx_t_6); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1164; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1165
 *         return Decimal(q, r._precision), r
 *     elif isinstance(y, numbers.Integral):
 *         r = Decimal(x)             # <<<<<<<<<<<<<<
 *         xv = x._value
 *         xp = x._precision
 */
    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(((PyObject *)__pyx_v_x));
    PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_x));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_x));
    __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1165; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_r = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_5);
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1166
 *     elif isinstance(y, numbers.Integral):
 *         r = Decimal(x)
 *         xv = x._value             # <<<<<<<<<<<<<<
 *         xp = x._precision
 *         yv = y * base10pow(xp)
 */
    __pyx_t_5 = __pyx_v_x->_value;
    __Pyx_INCREF(__pyx_t_5);
    __pyx_v_xv = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1167
 *         r = Decimal(x)
 *         xv = x._value
 *         xp = x._precision             # <<<<<<<<<<<<<<
 *         yv = y * base10pow(xp)
 *         q = xv // yv
 */
    __pyx_t_4 = __pyx_v_x->_precision;
    __pyx_v_xp = __pyx_t_4;

    /* "_cdecimalfp.pyx":1168
 *         xv = x._value
 *         xp = x._precision
 *         yv = y * base10pow(xp)             # <<<<<<<<<<<<<<
 *         q = xv // yv
 *         r._value = xv - q * yv
 */
    __pyx_t_5 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_xp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PyNumber_Multiply(__pyx_v_y, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1168; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_v_yv = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "_cdecimalfp.pyx":1169
 *         xp = x._precision
 *         yv = y * base10pow(xp)
 *         q = xv // yv             # <<<<<<<<<<<<<<
 *         r._value = xv - q * yv
 *         return Decimal(q, xp), r
 */
    __pyx_t_6 = PyNumber_FloorDivide(__pyx_v_xv, __pyx_v_yv); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1169; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_v_q = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "_cdecimalfp.pyx":1170
 *         yv = y * base10pow(xp)
 *         q = xv // yv
 *         r._value = xv - q * yv             # <<<<<<<<<<<<<<
 *         return Decimal(q, xp), r
 *     elif isinstance(y, _StdLibDecimal):
 */
    __pyx_t_6 = PyNumber_Multiply(__pyx_v_q, __pyx_v_yv); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = PyNumber_Subtract(__pyx_v_xv, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1170; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_GIVEREF(__pyx_t_5);
    __Pyx_GOTREF(__pyx_v_r->_value);
    __Pyx_DECREF(__pyx_v_r->_value);
    __pyx_v_r->_value = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1171
 *         q = xv // yv
 *         r._value = xv - q * yv
 *         return Decimal(q, xp), r             # <<<<<<<<<<<<<<
 *     elif isinstance(y, _StdLibDecimal):
 *         return x.__divmod__(Decimal(y))
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_xp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_v_q);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_q);
    __Pyx_GIVEREF(__pyx_v_q);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1171; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_5);
    __Pyx_INCREF(((PyObject *)__pyx_v_r));
    PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_v_r));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_r));
    __pyx_t_5 = 0;
    __pyx_r = ((PyObject*)__pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1172
 *         r._value = xv - q * yv
 *         return Decimal(q, xp), r
 *     elif isinstance(y, _StdLibDecimal):             # <<<<<<<<<<<<<<
 *         return x.__divmod__(Decimal(y))
 *     else:
 */
  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_y, __pyx_t_6); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1172; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1173
 *         return Decimal(q, xp), r
 *     elif isinstance(y, _StdLibDecimal):
 *         return x.__divmod__(Decimal(y))             # <<<<<<<<<<<<<<
 *     else:
 *         return x // y, x % y
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_x), __pyx_n_s_divmod); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_7 = PyTuple_New(1); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_INCREF(__pyx_v_y);
    PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_y);
    __Pyx_GIVEREF(__pyx_v_y);
    __pyx_t_8 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_7, NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (!__pyx_t_7) {
      __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_5, __pyx_t_8); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
      __Pyx_GOTREF(__pyx_t_6);
    } else {
      __pyx_t_9 = PyTuple_New(1+1); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_9);
      PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
      PyTuple_SET_ITEM(__pyx_t_9, 0+1, __pyx_t_8);
      __Pyx_GIVEREF(__pyx_t_8);
      __pyx_t_8 = 0;
      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0;
    }
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (!(likely(PyTuple_CheckExact(__pyx_t_6))||((__pyx_t_6) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_6)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1173; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_r = ((PyObject*)__pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1175
 *         return x.__divmod__(Decimal(y))
 *     else:
 *         return x // y, x % y             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_6 = PyNumber_FloorDivide(((PyObject *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_9 = PyTuple_New(2); if (unlikely(!__pyx_t_9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1175; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_9);
    PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_9, 1, __pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_5);
    __pyx_t_6 = 0;
    __pyx_t_5 = 0;
    __pyx_r = ((PyObject*)__pyx_t_9);
    __pyx_t_9 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1147
 * 
 * 
 * cdef tuple divmod1(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x // y, x % y"""
 *     cdef int xp, yp
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_XDECREF(__pyx_t_9);
  __Pyx_AddTraceback("_cdecimalfp.divmod1", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_r);
  __Pyx_XDECREF(__pyx_v_xv);
  __Pyx_XDECREF(__pyx_v_yv);
  __Pyx_XDECREF(__pyx_v_q);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1178
 * 
 * 
 * cdef tuple divmod2(object x, Decimal y):             # <<<<<<<<<<<<<<
 *     """x // y, x % y"""
 *     cdef int xp, yp
 */

static PyObject *__pyx_f_11_cdecimalfp_divmod2(PyObject *__pyx_v_x, struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_y) {
  int __pyx_v_xp;
  int __pyx_v_yp;
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_r = 0;
  PyObject *__pyx_v_xv = NULL;
  PyObject *__pyx_v_yv = NULL;
  PyObject *__pyx_v_q = NULL;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  int __pyx_t_3;
  int __pyx_t_4;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("divmod2", 0);

  /* "_cdecimalfp.pyx":1182
 *     cdef int xp, yp
 *     cdef Decimal r
 *     if isinstance(x, Decimal):             # <<<<<<<<<<<<<<
 *         xp, yp = (<Decimal>x)._precision, y._precision
 *         if xp >= yp:
 */
  __pyx_t_1 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1183
 *     cdef Decimal r
 *     if isinstance(x, Decimal):
 *         xp, yp = (<Decimal>x)._precision, y._precision             # <<<<<<<<<<<<<<
 *         if xp >= yp:
 *             r = Decimal(x)
 */
    __pyx_t_3 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x)->_precision;
    __pyx_t_4 = __pyx_v_y->_precision;
    __pyx_v_xp = __pyx_t_3;
    __pyx_v_yp = __pyx_t_4;

    /* "_cdecimalfp.pyx":1184
 *     if isinstance(x, Decimal):
 *         xp, yp = (<Decimal>x)._precision, y._precision
 *         if xp >= yp:             # <<<<<<<<<<<<<<
 *             r = Decimal(x)
 *             xv = (<Decimal>x)._value
 */
    __pyx_t_2 = ((__pyx_v_xp >= __pyx_v_yp) != 0);
    if (__pyx_t_2) {

      /* "_cdecimalfp.pyx":1185
 *         xp, yp = (<Decimal>x)._precision, y._precision
 *         if xp >= yp:
 *             r = Decimal(x)             # <<<<<<<<<<<<<<
 *             xv = (<Decimal>x)._value
 *             yv = y._value * base10pow(xp - yp)
 */
      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF(__pyx_v_x);
      PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_x);
      __Pyx_GIVEREF(__pyx_v_x);
      __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1185; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_v_r = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_6);
      __pyx_t_6 = 0;

      /* "_cdecimalfp.pyx":1186
 *         if xp >= yp:
 *             r = Decimal(x)
 *             xv = (<Decimal>x)._value             # <<<<<<<<<<<<<<
 *             yv = y._value * base10pow(xp - yp)
 *         else:
 */
      __pyx_t_6 = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x)->_value;
      __Pyx_INCREF(__pyx_t_6);
      __pyx_v_xv = __pyx_t_6;
      __pyx_t_6 = 0;

      /* "_cdecimalfp.pyx":1187
 *             r = Decimal(x)
 *             xv = (<Decimal>x)._value
 *             yv = y._value * base10pow(xp - yp)             # <<<<<<<<<<<<<<
 *         else:
 *             r = Decimal(y)
 */
      __pyx_t_6 = __pyx_f_11_cdecimalfp_base10pow((__pyx_v_xp - __pyx_v_yp)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_5 = PyNumber_Multiply(__pyx_v_y->_value, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1187; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_v_yv = __pyx_t_5;
      __pyx_t_5 = 0;
      goto __pyx_L4;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":1189
 *             yv = y._value * base10pow(xp - yp)
 *         else:
 *             r = Decimal(y)             # <<<<<<<<<<<<<<
 *             xv = (<Decimal>x)._value * base10pow(yp - xp)
 *             yv = y._value
 */
      __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_INCREF(((PyObject *)__pyx_v_y));
      PyTuple_SET_ITEM(__pyx_t_5, 0, ((PyObject *)__pyx_v_y));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_y));
      __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1189; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
      __pyx_v_r = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_6);
      __pyx_t_6 = 0;

      /* "_cdecimalfp.pyx":1190
 *         else:
 *             r = Decimal(y)
 *             xv = (<Decimal>x)._value * base10pow(yp - xp)             # <<<<<<<<<<<<<<
 *             yv = y._value
 *         q = xv // yv
 */
      __pyx_t_6 = __pyx_f_11_cdecimalfp_base10pow((__pyx_v_yp - __pyx_v_xp)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __pyx_t_5 = PyNumber_Multiply(((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_v_x)->_value, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1190; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_5);
      __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
      __pyx_v_xv = __pyx_t_5;
      __pyx_t_5 = 0;

      /* "_cdecimalfp.pyx":1191
 *             r = Decimal(y)
 *             xv = (<Decimal>x)._value * base10pow(yp - xp)
 *             yv = y._value             # <<<<<<<<<<<<<<
 *         q = xv // yv
 *         r._value = xv - q * yv
 */
      __pyx_t_5 = __pyx_v_y->_value;
      __Pyx_INCREF(__pyx_t_5);
      __pyx_v_yv = __pyx_t_5;
      __pyx_t_5 = 0;
    }
    __pyx_L4:;

    /* "_cdecimalfp.pyx":1192
 *             xv = (<Decimal>x)._value * base10pow(yp - xp)
 *             yv = y._value
 *         q = xv // yv             # <<<<<<<<<<<<<<
 *         r._value = xv - q * yv
 *         return Decimal(q, r._precision), r
 */
    __pyx_t_5 = PyNumber_FloorDivide(__pyx_v_xv, __pyx_v_yv); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1192; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_v_q = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1193
 *             yv = y._value
 *         q = xv // yv
 *         r._value = xv - q * yv             # <<<<<<<<<<<<<<
 *         return Decimal(q, r._precision), r
 *     elif isinstance(x, numbers.Integral):
 */
    __pyx_t_5 = PyNumber_Multiply(__pyx_v_q, __pyx_v_yv); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PyNumber_Subtract(__pyx_v_xv, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1193; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __Pyx_GIVEREF(__pyx_t_6);
    __Pyx_GOTREF(__pyx_v_r->_value);
    __Pyx_DECREF(__pyx_v_r->_value);
    __pyx_v_r->_value = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "_cdecimalfp.pyx":1194
 *         q = xv // yv
 *         r._value = xv - q * yv
 *         return Decimal(q, r._precision), r             # <<<<<<<<<<<<<<
 *     elif isinstance(x, numbers.Integral):
 *         r = Decimal(y)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_r->_precision); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_v_q);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_q);
    __Pyx_GIVEREF(__pyx_v_q);
    PyTuple_SET_ITEM(__pyx_t_5, 1, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_6);
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = PyTuple_New(2); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1194; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_6);
    __Pyx_INCREF(((PyObject *)__pyx_v_r));
    PyTuple_SET_ITEM(__pyx_t_5, 1, ((PyObject *)__pyx_v_r));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_r));
    __pyx_t_6 = 0;
    __pyx_r = ((PyObject*)__pyx_t_5);
    __pyx_t_5 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1195
 *         r._value = xv - q * yv
 *         return Decimal(q, r._precision), r
 *     elif isinstance(x, numbers.Integral):             # <<<<<<<<<<<<<<
 *         r = Decimal(y)
 *         yv = y._value
 */
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_Integral); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_2 = PyObject_IsInstance(__pyx_v_x, __pyx_t_6); if (unlikely(__pyx_t_2 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1195; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_1 = (__pyx_t_2 != 0);
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1196
 *         return Decimal(q, r._precision), r
 *     elif isinstance(x, numbers.Integral):
 *         r = Decimal(y)             # <<<<<<<<<<<<<<
 *         yv = y._value
 *         yp = y._precision
 */
    __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(((PyObject *)__pyx_v_y));
    PyTuple_SET_ITEM(__pyx_t_6, 0, ((PyObject *)__pyx_v_y));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_y));
    __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1196; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_v_r = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_5);
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1197
 *     elif isinstance(x, numbers.Integral):
 *         r = Decimal(y)
 *         yv = y._value             # <<<<<<<<<<<<<<
 *         yp = y._precision
 *         xv = x * base10pow(yp)
 */
    __pyx_t_5 = __pyx_v_y->_value;
    __Pyx_INCREF(__pyx_t_5);
    __pyx_v_yv = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1198
 *         r = Decimal(y)
 *         yv = y._value
 *         yp = y._precision             # <<<<<<<<<<<<<<
 *         xv = x * base10pow(yp)
 *         q = xv // yv
 */
    __pyx_t_4 = __pyx_v_y->_precision;
    __pyx_v_yp = __pyx_t_4;

    /* "_cdecimalfp.pyx":1199
 *         yv = y._value
 *         yp = y._precision
 *         xv = x * base10pow(yp)             # <<<<<<<<<<<<<<
 *         q = xv // yv
 *         r._value = xv - q * yv
 */
    __pyx_t_5 = __pyx_f_11_cdecimalfp_base10pow(__pyx_v_yp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PyNumber_Multiply(__pyx_v_x, __pyx_t_5); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1199; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_v_xv = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "_cdecimalfp.pyx":1200
 *         yp = y._precision
 *         xv = x * base10pow(yp)
 *         q = xv // yv             # <<<<<<<<<<<<<<
 *         r._value = xv - q * yv
 *         return Decimal(q, yp), r
 */
    __pyx_t_6 = PyNumber_FloorDivide(__pyx_v_xv, __pyx_v_yv); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1200; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_v_q = __pyx_t_6;
    __pyx_t_6 = 0;

    /* "_cdecimalfp.pyx":1201
 *         xv = x * base10pow(yp)
 *         q = xv // yv
 *         r._value = xv - q * yv             # <<<<<<<<<<<<<<
 *         return Decimal(q, yp), r
 *     elif isinstance(x, _StdLibDecimal):
 */
    __pyx_t_6 = PyNumber_Multiply(__pyx_v_q, __pyx_v_yv); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = PyNumber_Subtract(__pyx_v_xv, __pyx_t_6); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1201; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __Pyx_GIVEREF(__pyx_t_5);
    __Pyx_GOTREF(__pyx_v_r->_value);
    __Pyx_DECREF(__pyx_v_r->_value);
    __pyx_v_r->_value = __pyx_t_5;
    __pyx_t_5 = 0;

    /* "_cdecimalfp.pyx":1202
 *         q = xv // yv
 *         r._value = xv - q * yv
 *         return Decimal(q, yp), r             # <<<<<<<<<<<<<<
 *     elif isinstance(x, _StdLibDecimal):
 *         return Decimal(x).__divmod__(y)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = __Pyx_PyInt_From_int(__pyx_v_yp); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_INCREF(__pyx_v_q);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_v_q);
    __Pyx_GIVEREF(__pyx_v_q);
    PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_5);
    __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_6, NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = PyTuple_New(2); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1202; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_5);
    __Pyx_INCREF(((PyObject *)__pyx_v_r));
    PyTuple_SET_ITEM(__pyx_t_6, 1, ((PyObject *)__pyx_v_r));
    __Pyx_GIVEREF(((PyObject *)__pyx_v_r));
    __pyx_t_5 = 0;
    __pyx_r = ((PyObject*)__pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1203
 *         r._value = xv - q * yv
 *         return Decimal(q, yp), r
 *     elif isinstance(x, _StdLibDecimal):             # <<<<<<<<<<<<<<
 *         return Decimal(x).__divmod__(y)
 *     else:
 */
  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_1 = PyObject_IsInstance(__pyx_v_x, __pyx_t_6); if (unlikely(__pyx_t_1 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1203; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1204
 *         return Decimal(q, yp), r
 *     elif isinstance(x, _StdLibDecimal):
 *         return Decimal(x).__divmod__(y)             # <<<<<<<<<<<<<<
 *     else:
 *         return x // y, x % y
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_5 = PyTuple_New(1); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_INCREF(__pyx_v_x);
    PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_x);
    __Pyx_GIVEREF(__pyx_v_x);
    __pyx_t_7 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_5, NULL); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_7);
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_divmod); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0;
    __pyx_t_7 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_5))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_5, function);
      }
    }
    if (!__pyx_t_7) {
      __pyx_t_6 = __Pyx_PyObject_CallOneArg(__pyx_t_5, ((PyObject *)__pyx_v_y)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
    } else {
      __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
      __Pyx_INCREF(((PyObject *)__pyx_v_y));
      PyTuple_SET_ITEM(__pyx_t_8, 0+1, ((PyObject *)__pyx_v_y));
      __Pyx_GIVEREF(((PyObject *)__pyx_v_y));
      __pyx_t_6 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_8, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_6);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    }
    __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    if (!(likely(PyTuple_CheckExact(__pyx_t_6))||((__pyx_t_6) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_t_6)->tp_name), 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1204; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_r = ((PyObject*)__pyx_t_6);
    __pyx_t_6 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1206
 *         return Decimal(x).__divmod__(y)
 *     else:
 *         return x // y, x % y             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_6 = PyNumber_FloorDivide(__pyx_v_x, ((PyObject *)__pyx_v_y)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_5 = PyNumber_Remainder(__pyx_v_x, ((PyObject *)__pyx_v_y)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_5);
    __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1206; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_5);
    __Pyx_GIVEREF(__pyx_t_5);
    __pyx_t_6 = 0;
    __pyx_t_5 = 0;
    __pyx_r = ((PyObject*)__pyx_t_8);
    __pyx_t_8 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1178
 * 
 * 
 * cdef tuple divmod2(object x, Decimal y):             # <<<<<<<<<<<<<<
 *     """x // y, x % y"""
 *     cdef int xp, yp
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("_cdecimalfp.divmod2", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_r);
  __Pyx_XDECREF(__pyx_v_xv);
  __Pyx_XDECREF(__pyx_v_yv);
  __Pyx_XDECREF(__pyx_v_q);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1209
 * 
 * 
 * cdef object floordiv1(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x // y"""
 *     if isinstance(y, (Decimal, numbers.Integral, _StdLibDecimal)):
 */

static PyObject *__pyx_f_11_cdecimalfp_floordiv1(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("floordiv1", 0);

  /* "_cdecimalfp.pyx":1211
 * cdef object floordiv1(Decimal x, object y):
 *     """x // y"""
 *     if isinstance(y, (Decimal, numbers.Integral, _StdLibDecimal)):             # <<<<<<<<<<<<<<
 *         return divmod1(x, y)[0]
 *     else:
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Integral); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1211; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  if (!__pyx_t_5) {
  } else {
    __pyx_t_3 = __pyx_t_5;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_5 = PyObject_IsInstance(__pyx_v_y, __pyx_t_2); 
  __pyx_t_4 = (__pyx_t_5 != 0);
  if (!__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = PyObject_IsInstance(__pyx_v_y, __pyx_t_1); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_5;
  __pyx_L4_bool_binop_done:;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = (__pyx_t_3 != 0);
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":1212
 *     """x // y"""
 *     if isinstance(y, (Decimal, numbers.Integral, _StdLibDecimal)):
 *         return divmod1(x, y)[0]             # <<<<<<<<<<<<<<
 *     else:
 *         return Decimal(math.floor(x / y), x._precision)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __pyx_f_11_cdecimalfp_divmod1(__pyx_v_x, __pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    if (unlikely(__pyx_t_2 == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1212; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1214
 *         return divmod1(x, y)[0]
 *     else:
 *         return Decimal(math.floor(x / y), x._precision)             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_floor); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyNumber_Divide(((PyObject *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_7 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_6))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_6, function);
      }
    }
    if (!__pyx_t_7) {
      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else {
      __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
      PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_2);
      __Pyx_GIVEREF(__pyx_t_2);
      __pyx_t_2 = 0;
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    }
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_x->_precision); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_6);
    __pyx_t_1 = 0;
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_8, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1214; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_r = __pyx_t_6;
    __pyx_t_6 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1209
 * 
 * 
 * cdef object floordiv1(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x // y"""
 *     if isinstance(y, (Decimal, numbers.Integral, _StdLibDecimal)):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("_cdecimalfp.floordiv1", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1217
 * 
 * 
 * cdef object floordiv2(object x, Decimal y):             # <<<<<<<<<<<<<<
 *     """x // y"""
 *     if isinstance(x, (Decimal, numbers.Integral, _StdLibDecimal)):
 */

static PyObject *__pyx_f_11_cdecimalfp_floordiv2(PyObject *__pyx_v_x, struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  PyObject *__pyx_t_6 = NULL;
  PyObject *__pyx_t_7 = NULL;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("floordiv2", 0);

  /* "_cdecimalfp.pyx":1219
 * cdef object floordiv2(object x, Decimal y):
 *     """x // y"""
 *     if isinstance(x, (Decimal, numbers.Integral, _StdLibDecimal)):             # <<<<<<<<<<<<<<
 *         return divmod2(x, y)[0]
 *     else:
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Integral); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1219; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  if (!__pyx_t_5) {
  } else {
    __pyx_t_3 = __pyx_t_5;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_5 = PyObject_IsInstance(__pyx_v_x, __pyx_t_2); 
  __pyx_t_4 = (__pyx_t_5 != 0);
  if (!__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = PyObject_IsInstance(__pyx_v_x, __pyx_t_1); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_5;
  __pyx_L4_bool_binop_done:;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = (__pyx_t_3 != 0);
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":1220
 *     """x // y"""
 *     if isinstance(x, (Decimal, numbers.Integral, _StdLibDecimal)):
 *         return divmod2(x, y)[0]             # <<<<<<<<<<<<<<
 *     else:
 *         return Decimal(math.floor(x / y), y._precision)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __pyx_f_11_cdecimalfp_divmod2(__pyx_v_x, __pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    if (unlikely(__pyx_t_2 == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1220; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_t_2, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1220; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1222
 *         return divmod2(x, y)[0]
 *     else:
 *         return Decimal(math.floor(x / y), y._precision)             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_floor); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_2 = __Pyx_PyNumber_Divide(__pyx_v_x, ((PyObject *)__pyx_v_y)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_7 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_6))) {
      __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6);
      if (likely(__pyx_t_7)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6);
        __Pyx_INCREF(__pyx_t_7);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_6, function);
      }
    }
    if (!__pyx_t_7) {
      __pyx_t_1 = __Pyx_PyObject_CallOneArg(__pyx_t_6, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GOTREF(__pyx_t_1);
    } else {
      __pyx_t_8 = PyTuple_New(1+1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_8);
      PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_7 = NULL;
      PyTuple_SET_ITEM(__pyx_t_8, 0+1, __pyx_t_2);
      __Pyx_GIVEREF(__pyx_t_2);
      __pyx_t_2 = 0;
      __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_8, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    }
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyInt_From_int(__pyx_v_y->_precision); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __pyx_t_8 = PyTuple_New(2); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_8);
    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_8, 1, __pyx_t_6);
    __Pyx_GIVEREF(__pyx_t_6);
    __pyx_t_1 = 0;
    __pyx_t_6 = 0;
    __pyx_t_6 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_t_8, NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1222; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
    __pyx_r = __pyx_t_6;
    __pyx_t_6 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1217
 * 
 * 
 * cdef object floordiv2(object x, Decimal y):             # <<<<<<<<<<<<<<
 *     """x // y"""
 *     if isinstance(x, (Decimal, numbers.Integral, _StdLibDecimal)):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_7);
  __Pyx_XDECREF(__pyx_t_8);
  __Pyx_AddTraceback("_cdecimalfp.floordiv2", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1225
 * 
 * 
 * cdef object mod1(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x % y"""
 *     if isinstance(y, (Decimal, numbers.Integral, _StdLibDecimal)):
 */

static PyObject *__pyx_f_11_cdecimalfp_mod1(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_x, PyObject *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("mod1", 0);

  /* "_cdecimalfp.pyx":1227
 * cdef object mod1(Decimal x, object y):
 *     """x % y"""
 *     if isinstance(y, (Decimal, numbers.Integral, _StdLibDecimal)):             # <<<<<<<<<<<<<<
 *         return divmod1(x, y)[1]
 *     else:
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Integral); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1227; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_TypeCheck(__pyx_v_y, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  if (!__pyx_t_5) {
  } else {
    __pyx_t_3 = __pyx_t_5;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_5 = PyObject_IsInstance(__pyx_v_y, __pyx_t_2); 
  __pyx_t_4 = (__pyx_t_5 != 0);
  if (!__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = PyObject_IsInstance(__pyx_v_y, __pyx_t_1); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_5;
  __pyx_L4_bool_binop_done:;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = (__pyx_t_3 != 0);
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":1228
 *     """x % y"""
 *     if isinstance(y, (Decimal, numbers.Integral, _StdLibDecimal)):
 *         return divmod1(x, y)[1]             # <<<<<<<<<<<<<<
 *     else:
 *         return x - y * (x // y)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __pyx_f_11_cdecimalfp_divmod1(__pyx_v_x, __pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    if (unlikely(__pyx_t_2 == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1228; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1228; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1230
 *         return divmod1(x, y)[1]
 *     else:
 *         return x - y * (x // y)             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = PyNumber_FloorDivide(((PyObject *)__pyx_v_x), __pyx_v_y); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PyNumber_Multiply(__pyx_v_y, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyNumber_Subtract(((PyObject *)__pyx_v_x), __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1230; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1225
 * 
 * 
 * cdef object mod1(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x % y"""
 *     if isinstance(y, (Decimal, numbers.Integral, _StdLibDecimal)):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.mod1", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1233
 * 
 * 
 * cdef object mod2(object x, Decimal y):             # <<<<<<<<<<<<<<
 *     """x % y"""
 *     if isinstance(x, (Decimal, numbers.Integral, _StdLibDecimal)):
 */

static PyObject *__pyx_f_11_cdecimalfp_mod2(PyObject *__pyx_v_x, struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("mod2", 0);

  /* "_cdecimalfp.pyx":1235
 * cdef object mod2(object x, Decimal y):
 *     """x % y"""
 *     if isinstance(x, (Decimal, numbers.Integral, _StdLibDecimal)):             # <<<<<<<<<<<<<<
 *         return divmod2(x, y)[1]
 *     else:
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Integral); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_StdLibDecimal); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1235; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = __Pyx_TypeCheck(__pyx_v_x, ((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  if (!__pyx_t_5) {
  } else {
    __pyx_t_3 = __pyx_t_5;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_5 = PyObject_IsInstance(__pyx_v_x, __pyx_t_2); 
  __pyx_t_4 = (__pyx_t_5 != 0);
  if (!__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = PyObject_IsInstance(__pyx_v_x, __pyx_t_1); 
  __pyx_t_5 = (__pyx_t_4 != 0);
  __pyx_t_3 = __pyx_t_5;
  __pyx_L4_bool_binop_done:;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_5 = (__pyx_t_3 != 0);
  if (__pyx_t_5) {

    /* "_cdecimalfp.pyx":1236
 *     """x % y"""
 *     if isinstance(x, (Decimal, numbers.Integral, _StdLibDecimal)):
 *         return divmod2(x, y)[1]             # <<<<<<<<<<<<<<
 *     else:
 *         return x - y * (x // y)
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __pyx_f_11_cdecimalfp_divmod2(__pyx_v_x, __pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    if (unlikely(__pyx_t_2 == Py_None)) {
      PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable");
      {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1236; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_t_2, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(__pyx_t_1 == NULL)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1236; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1238
 *         return divmod2(x, y)[1]
 *     else:
 *         return x - y * (x // y)             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_1 = PyNumber_FloorDivide(__pyx_v_x, ((PyObject *)__pyx_v_y)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __pyx_t_2 = PyNumber_Multiply(((PyObject *)__pyx_v_y), __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __pyx_t_1 = PyNumber_Subtract(__pyx_v_x, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1233
 * 
 * 
 * cdef object mod2(object x, Decimal y):             # <<<<<<<<<<<<<<
 *     """x % y"""
 *     if isinstance(x, (Decimal, numbers.Integral, _StdLibDecimal)):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.mod2", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1241
 * 
 * 
 * cdef object pow1(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x ** y"""
 *     cdef int exp
 */

static PyObject *__pyx_f_11_cdecimalfp_pow1(struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_x, PyObject *__pyx_v_y) {
  int __pyx_v_exp;
  struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_result = 0;
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_t_5;
  double __pyx_t_6;
  double __pyx_t_7;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("pow1", 0);

  /* "_cdecimalfp.pyx":1245
 *     cdef int exp
 *     cdef Decimal result
 *     if isinstance(y, numbers.Integral):             # <<<<<<<<<<<<<<
 *         exp = int(y)
 *         if exp >= 0:
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Integral); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = PyObject_IsInstance(__pyx_v_y, __pyx_t_2); if (unlikely(__pyx_t_3 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1245; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_4 = (__pyx_t_3 != 0);
  if (__pyx_t_4) {

    /* "_cdecimalfp.pyx":1246
 *     cdef Decimal result
 *     if isinstance(y, numbers.Integral):
 *         exp = int(y)             # <<<<<<<<<<<<<<
 *         if exp >= 0:
 *             result = Decimal()
 */
    __pyx_t_2 = PyNumber_Int(__pyx_v_y); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_5 = __Pyx_PyInt_As_int(__pyx_t_2); if (unlikely((__pyx_t_5 == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1246; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_v_exp = __pyx_t_5;

    /* "_cdecimalfp.pyx":1247
 *     if isinstance(y, numbers.Integral):
 *         exp = int(y)
 *         if exp >= 0:             # <<<<<<<<<<<<<<
 *             result = Decimal()
 *             result._value = x._value ** exp
 */
    __pyx_t_4 = ((__pyx_v_exp >= 0) != 0);
    if (__pyx_t_4) {

      /* "_cdecimalfp.pyx":1248
 *         exp = int(y)
 *         if exp >= 0:
 *             result = Decimal()             # <<<<<<<<<<<<<<
 *             result._value = x._value ** exp
 *             result._precision = x._precision * exp
 */
      __pyx_t_2 = __Pyx_PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)), __pyx_empty_tuple, NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1248; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_v_result = ((struct __pyx_obj_11_cdecimalfp_Decimal *)__pyx_t_2);
      __pyx_t_2 = 0;

      /* "_cdecimalfp.pyx":1249
 *         if exp >= 0:
 *             result = Decimal()
 *             result._value = x._value ** exp             # <<<<<<<<<<<<<<
 *             result._precision = x._precision * exp
 *             return result
 */
      __pyx_t_2 = __Pyx_PyInt_From_int(__pyx_v_exp); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_t_1 = PyNumber_Power(__pyx_v_x->_value, __pyx_t_2, Py_None); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1249; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __Pyx_GIVEREF(__pyx_t_1);
      __Pyx_GOTREF(__pyx_v_result->_value);
      __Pyx_DECREF(__pyx_v_result->_value);
      __pyx_v_result->_value = __pyx_t_1;
      __pyx_t_1 = 0;

      /* "_cdecimalfp.pyx":1250
 *             result = Decimal()
 *             result._value = x._value ** exp
 *             result._precision = x._precision * exp             # <<<<<<<<<<<<<<
 *             return result
 *         else:
 */
      __pyx_v_result->_precision = (__pyx_v_x->_precision * __pyx_v_exp);

      /* "_cdecimalfp.pyx":1251
 *             result._value = x._value ** exp
 *             result._precision = x._precision * exp
 *             return result             # <<<<<<<<<<<<<<
 *         else:
 *             return 1 / pow1(x, -y)
 */
      __Pyx_XDECREF(__pyx_r);
      __Pyx_INCREF(((PyObject *)__pyx_v_result));
      __pyx_r = ((PyObject *)__pyx_v_result);
      goto __pyx_L0;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":1253
 *             return result
 *         else:
 *             return 1 / pow1(x, -y)             # <<<<<<<<<<<<<<
 *     elif isinstance(y, numbers.Rational):
 *         if y.denominator == 1:
 */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_1 = PyNumber_Negative(__pyx_v_y); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_2 = __pyx_f_11_cdecimalfp_pow1(__pyx_v_x, __pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_t_1 = __Pyx_PyNumber_Divide(__pyx_int_1, __pyx_t_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1253; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
      __pyx_r = __pyx_t_1;
      __pyx_t_1 = 0;
      goto __pyx_L0;
    }
  }

  /* "_cdecimalfp.pyx":1254
 *         else:
 *             return 1 / pow1(x, -y)
 *     elif isinstance(y, numbers.Rational):             # <<<<<<<<<<<<<<
 *         if y.denominator == 1:
 *             return x ** y.numerator
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_Rational); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = PyObject_IsInstance(__pyx_v_y, __pyx_t_2); if (unlikely(__pyx_t_4 == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1254; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = (__pyx_t_4 != 0);
  if (__pyx_t_3) {

    /* "_cdecimalfp.pyx":1255
 *             return 1 / pow1(x, -y)
 *     elif isinstance(y, numbers.Rational):
 *         if y.denominator == 1:             # <<<<<<<<<<<<<<
 *             return x ** y.numerator
 *         else:
 */
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_denominator); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyObject_RichCompare(__pyx_t_2, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1255; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    if (__pyx_t_3) {

      /* "_cdecimalfp.pyx":1256
 *     elif isinstance(y, numbers.Rational):
 *         if y.denominator == 1:
 *             return x ** y.numerator             # <<<<<<<<<<<<<<
 *         else:
 *             return float(x) ** float(y)
 */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_y, __pyx_n_s_numerator); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_1);
      __pyx_t_2 = PyNumber_Power(((PyObject *)__pyx_v_x), __pyx_t_1, Py_None); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1256; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
      __pyx_r = __pyx_t_2;
      __pyx_t_2 = 0;
      goto __pyx_L0;
    }
    /*else*/ {

      /* "_cdecimalfp.pyx":1258
 *             return x ** y.numerator
 *         else:
 *             return float(x) ** float(y)             # <<<<<<<<<<<<<<
 *     else:
 *         return float(x) ** y
 */
      __Pyx_XDECREF(__pyx_r);
      __pyx_t_6 = __Pyx_PyObject_AsDouble(((PyObject *)__pyx_v_x)); if (unlikely(__pyx_t_6 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_7 = __Pyx_PyObject_AsDouble(__pyx_v_y); if (unlikely(__pyx_t_7 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __pyx_t_2 = PyFloat_FromDouble(pow(__pyx_t_6, __pyx_t_7)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1258; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_GOTREF(__pyx_t_2);
      __pyx_r = __pyx_t_2;
      __pyx_t_2 = 0;
      goto __pyx_L0;
    }
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1260
 *             return float(x) ** float(y)
 *     else:
 *         return float(x) ** y             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_7 = __Pyx_PyObject_AsDouble(((PyObject *)__pyx_v_x)); if (unlikely(__pyx_t_7 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __pyx_t_2 = PyFloat_FromDouble(__pyx_t_7); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyNumber_Power(__pyx_t_2, __pyx_v_y, Py_None); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1241
 * 
 * 
 * cdef object pow1(Decimal x, object y):             # <<<<<<<<<<<<<<
 *     """x ** y"""
 *     cdef int exp
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.pow1", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF((PyObject *)__pyx_v_result);
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1263
 * 
 * 
 * cdef object pow2(object x, Decimal y):             # <<<<<<<<<<<<<<
 *     """x ** y"""
 *     if y.denominator == 1:
 */

static PyObject *__pyx_f_11_cdecimalfp_pow2(PyObject *__pyx_v_x, struct __pyx_obj_11_cdecimalfp_Decimal *__pyx_v_y) {
  PyObject *__pyx_r = NULL;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  double __pyx_t_4;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("pow2", 0);

  /* "_cdecimalfp.pyx":1265
 * cdef object pow2(object x, Decimal y):
 *     """x ** y"""
 *     if y.denominator == 1:             # <<<<<<<<<<<<<<
 *         return x ** y.numerator
 *     return x ** float(y)
 */
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_y), __pyx_n_s_denominator); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_int_1, Py_EQ); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1265; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (__pyx_t_3) {

    /* "_cdecimalfp.pyx":1266
 *     """x ** y"""
 *     if y.denominator == 1:
 *         return x ** y.numerator             # <<<<<<<<<<<<<<
 *     return x ** float(y)
 * 
 */
    __Pyx_XDECREF(__pyx_r);
    __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v_y), __pyx_n_s_numerator); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    __pyx_t_1 = PyNumber_Power(__pyx_v_x, __pyx_t_2, Py_None); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1266; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    __pyx_r = __pyx_t_1;
    __pyx_t_1 = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1267
 *     if y.denominator == 1:
 *         return x ** y.numerator
 *     return x ** float(y)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __Pyx_XDECREF(__pyx_r);
  __pyx_t_4 = __Pyx_PyObject_AsDouble(((PyObject *)__pyx_v_y)); if (unlikely(__pyx_t_4 == ((double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_1 = PyFloat_FromDouble(__pyx_t_4); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Power(__pyx_v_x, __pyx_t_1, Py_None); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1267; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_r = __pyx_t_2;
  __pyx_t_2 = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":1263
 * 
 * 
 * cdef object pow2(object x, Decimal y):             # <<<<<<<<<<<<<<
 *     """x ** y"""
 *     if y.denominator == 1:
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_AddTraceback("_cdecimalfp.pow2", __pyx_clineno, __pyx_lineno, __pyx_filename);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XGIVEREF(__pyx_r);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1274
 * # Round towards 0 (aka truncate)
 * # quotient negativ => add 1
 * cdef int _round_down(q, r, y):             # <<<<<<<<<<<<<<
 *     if q < 0:
 *         return 1
 */

static int __pyx_f_11_cdecimalfp__round_down(PyObject *__pyx_v_q, CYTHON_UNUSED PyObject *__pyx_v_r, CYTHON_UNUSED PyObject *__pyx_v_y) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_round_down", 0);

  /* "_cdecimalfp.pyx":1275
 * # quotient negativ => add 1
 * cdef int _round_down(q, r, y):
 *     if q < 0:             # <<<<<<<<<<<<<<
 *         return 1
 *     else:
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_q, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1275; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1276
 * cdef int _round_down(q, r, y):
 *     if q < 0:
 *         return 1             # <<<<<<<<<<<<<<
 *     else:
 *         return 0
 */
    __pyx_r = 1;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1278
 *         return 1
 *     else:
 *         return 0             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1274
 * # Round towards 0 (aka truncate)
 * # quotient negativ => add 1
 * cdef int _round_down(q, r, y):             # <<<<<<<<<<<<<<
 *     if q < 0:
 *         return 1
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_WriteUnraisable("_cdecimalfp._round_down", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1283
 * # Round away from 0
 * # quotient not negativ => add 1
 * cdef int _round_up(q, r, y):             # <<<<<<<<<<<<<<
 *     if q >= 0:
 *         return 1
 */

static int __pyx_f_11_cdecimalfp__round_up(PyObject *__pyx_v_q, CYTHON_UNUSED PyObject *__pyx_v_r, CYTHON_UNUSED PyObject *__pyx_v_y) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  int __pyx_t_2;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_round_up", 0);

  /* "_cdecimalfp.pyx":1284
 * # quotient not negativ => add 1
 * cdef int _round_up(q, r, y):
 *     if q >= 0:             # <<<<<<<<<<<<<<
 *         return 1
 *     else:
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_q, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1284; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1285
 * cdef int _round_up(q, r, y):
 *     if q >= 0:
 *         return 1             # <<<<<<<<<<<<<<
 *     else:
 *         return 0
 */
    __pyx_r = 1;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1287
 *         return 1
 *     else:
 *         return 0             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1283
 * # Round away from 0
 * # quotient not negativ => add 1
 * cdef int _round_up(q, r, y):             # <<<<<<<<<<<<<<
 *     if q >= 0:
 *         return 1
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_WriteUnraisable("_cdecimalfp._round_up", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1294
 * # |remainder| = |divisor|/2 and quotient < 0
 * # => add 1
 * cdef int _round_half_down(q, r, y):             # <<<<<<<<<<<<<<
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q < 0):
 */

static int __pyx_f_11_cdecimalfp__round_half_down(PyObject *__pyx_v_q, PyObject *__pyx_v_r, PyObject *__pyx_v_y) {
  PyObject *__pyx_v_ar = NULL;
  PyObject *__pyx_v_ay = NULL;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_round_half_down", 0);

  /* "_cdecimalfp.pyx":1295
 * # => add 1
 * cdef int _round_half_down(q, r, y):
 *     ar, ay = abs(2*r), abs(y)             # <<<<<<<<<<<<<<
 *     if ar > ay or (ar == ay and q < 0):
 *         return 1
 */
  __pyx_t_1 = PyNumber_Multiply(__pyx_int_2, __pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyNumber_Absolute(__pyx_v_y); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1295; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ar = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_ay = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":1296
 * cdef int _round_half_down(q, r, y):
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q < 0):             # <<<<<<<<<<<<<<
 *         return 1
 *     else:
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ar, __pyx_v_ay, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (!__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ar, __pyx_v_ay, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_q, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = __pyx_t_4;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_3) {

    /* "_cdecimalfp.pyx":1297
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q < 0):
 *         return 1             # <<<<<<<<<<<<<<
 *     else:
 *         return 0
 */
    __pyx_r = 1;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1299
 *         return 1
 *     else:
 *         return 0             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1294
 * # |remainder| = |divisor|/2 and quotient < 0
 * # => add 1
 * cdef int _round_half_down(q, r, y):             # <<<<<<<<<<<<<<
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q < 0):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_WriteUnraisable("_cdecimalfp._round_half_down", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_ar);
  __Pyx_XDECREF(__pyx_v_ay);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1306
 * # |remainder| = |divisor|/2 and quotient >= 0
 * # => add 1
 * cdef int _round_half_up(q, r, y):             # <<<<<<<<<<<<<<
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q >= 0):
 */

static int __pyx_f_11_cdecimalfp__round_half_up(PyObject *__pyx_v_q, PyObject *__pyx_v_r, PyObject *__pyx_v_y) {
  PyObject *__pyx_v_ar = NULL;
  PyObject *__pyx_v_ay = NULL;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_round_half_up", 0);

  /* "_cdecimalfp.pyx":1307
 * # => add 1
 * cdef int _round_half_up(q, r, y):
 *     ar, ay = abs(2*r), abs(y)             # <<<<<<<<<<<<<<
 *     if ar > ay or (ar == ay and q >= 0):
 *         return 1
 */
  __pyx_t_1 = PyNumber_Multiply(__pyx_int_2, __pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyNumber_Absolute(__pyx_v_y); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1307; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ar = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_ay = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":1308
 * cdef int _round_half_up(q, r, y):
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q >= 0):             # <<<<<<<<<<<<<<
 *         return 1
 *     else:
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ar, __pyx_v_ay, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (!__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ar, __pyx_v_ay, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_q, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1308; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_3 = __pyx_t_4;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_3) {

    /* "_cdecimalfp.pyx":1309
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q >= 0):
 *         return 1             # <<<<<<<<<<<<<<
 *     else:
 *         return 0
 */
    __pyx_r = 1;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1311
 *         return 1
 *     else:
 *         return 0             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1306
 * # |remainder| = |divisor|/2 and quotient >= 0
 * # => add 1
 * cdef int _round_half_up(q, r, y):             # <<<<<<<<<<<<<<
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q >= 0):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_WriteUnraisable("_cdecimalfp._round_half_up", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_ar);
  __Pyx_XDECREF(__pyx_v_ay);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1318
 * # |remainder| = |divisor|/2 and quotient not even
 * # => add 1
 * cdef int _round_half_even(q, r, y):             # <<<<<<<<<<<<<<
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q % 2 != 0):
 */

static int __pyx_f_11_cdecimalfp__round_half_even(PyObject *__pyx_v_q, PyObject *__pyx_v_r, PyObject *__pyx_v_y) {
  PyObject *__pyx_v_ar = NULL;
  PyObject *__pyx_v_ay = NULL;
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  int __pyx_t_4;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_round_half_even", 0);

  /* "_cdecimalfp.pyx":1319
 * # => add 1
 * cdef int _round_half_even(q, r, y):
 *     ar, ay = abs(2*r), abs(y)             # <<<<<<<<<<<<<<
 *     if ar > ay or (ar == ay and q % 2 != 0):
 *         return 1
 */
  __pyx_t_1 = PyNumber_Multiply(__pyx_int_2, __pyx_v_r); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyNumber_Absolute(__pyx_t_1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyNumber_Absolute(__pyx_v_y); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1319; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_v_ar = __pyx_t_2;
  __pyx_t_2 = 0;
  __pyx_v_ay = __pyx_t_1;
  __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":1320
 * cdef int _round_half_even(q, r, y):
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q % 2 != 0):             # <<<<<<<<<<<<<<
 *         return 1
 *     else:
 */
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ar, __pyx_v_ay, Py_GT); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (!__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_1 = PyObject_RichCompare(__pyx_v_ar, __pyx_v_ay, Py_EQ); __Pyx_XGOTREF(__pyx_t_1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_1); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (__pyx_t_4) {
  } else {
    __pyx_t_3 = __pyx_t_4;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_1 = PyNumber_Remainder(__pyx_v_q, __pyx_int_2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = PyObject_RichCompare(__pyx_t_1, __pyx_int_0, Py_NE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1320; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = __pyx_t_4;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_3) {

    /* "_cdecimalfp.pyx":1321
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q % 2 != 0):
 *         return 1             # <<<<<<<<<<<<<<
 *     else:
 *         return 0
 */
    __pyx_r = 1;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1323
 *         return 1
 *     else:
 *         return 0             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1318
 * # |remainder| = |divisor|/2 and quotient not even
 * # => add 1
 * cdef int _round_half_even(q, r, y):             # <<<<<<<<<<<<<<
 *     ar, ay = abs(2*r), abs(y)
 *     if ar > ay or (ar == ay and q % 2 != 0):
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_WriteUnraisable("_cdecimalfp._round_half_even", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_ar);
  __Pyx_XDECREF(__pyx_v_ay);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1328
 * # Round up (not away from 0 if negative)
 * # => always add 1
 * cdef inline int _round_ceiling(q, r, y):             # <<<<<<<<<<<<<<
 *     return 1
 * 
 */

static CYTHON_INLINE int __pyx_f_11_cdecimalfp__round_ceiling(CYTHON_UNUSED PyObject *__pyx_v_q, CYTHON_UNUSED PyObject *__pyx_v_r, CYTHON_UNUSED PyObject *__pyx_v_y) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_round_ceiling", 0);

  /* "_cdecimalfp.pyx":1329
 * # => always add 1
 * cdef inline int _round_ceiling(q, r, y):
 *     return 1             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = 1;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":1328
 * # Round up (not away from 0 if negative)
 * # => always add 1
 * cdef inline int _round_ceiling(q, r, y):             # <<<<<<<<<<<<<<
 *     return 1
 * 
 */

  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1334
 * # Round down (not towards 0 if negative)
 * # => never add 1
 * cdef inline int _round_floor(q, r, y):             # <<<<<<<<<<<<<<
 *     return 0
 * 
 */

static CYTHON_INLINE int __pyx_f_11_cdecimalfp__round_floor(CYTHON_UNUSED PyObject *__pyx_v_q, CYTHON_UNUSED PyObject *__pyx_v_r, CYTHON_UNUSED PyObject *__pyx_v_y) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("_round_floor", 0);

  /* "_cdecimalfp.pyx":1335
 * # => never add 1
 * cdef inline int _round_floor(q, r, y):
 *     return 0             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_r = 0;
  goto __pyx_L0;

  /* "_cdecimalfp.pyx":1334
 * # Round down (not towards 0 if negative)
 * # => never add 1
 * cdef inline int _round_floor(q, r, y):             # <<<<<<<<<<<<<<
 *     return 0
 * 
 */

  /* function exit code */
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1342
 * # quotient negativ and (quotient + 1) not divisible by 5 without remainder
 * # => add 1
 * cdef int _round_05up(q, r, y):             # <<<<<<<<<<<<<<
 *     if q >= 0 and q % 5 == 0 or q < 0 and (q + 1) % 5 != 0:
 *         return 1
 */

static int __pyx_f_11_cdecimalfp__round_05up(PyObject *__pyx_v_q, CYTHON_UNUSED PyObject *__pyx_v_r, CYTHON_UNUSED PyObject *__pyx_v_y) {
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_round_05up", 0);

  /* "_cdecimalfp.pyx":1343
 * # => add 1
 * cdef int _round_05up(q, r, y):
 *     if q >= 0 and q % 5 == 0 or q < 0 and (q + 1) % 5 != 0:             # <<<<<<<<<<<<<<
 *         return 1
 *     else:
 */
  __pyx_t_2 = PyObject_RichCompare(__pyx_v_q, __pyx_int_0, Py_GE); __Pyx_XGOTREF(__pyx_t_2); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (!__pyx_t_3) {
    goto __pyx_L5_next_or;
  } else {
  }
  __pyx_t_2 = PyNumber_Remainder(__pyx_v_q, __pyx_int_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (!__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_L5_next_or:;
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_q, __pyx_int_0, Py_LT); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__pyx_t_3) {
  } else {
    __pyx_t_1 = __pyx_t_3;
    goto __pyx_L4_bool_binop_done;
  }
  __pyx_t_4 = PyNumber_Add(__pyx_v_q, __pyx_int_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_2 = PyNumber_Remainder(__pyx_t_4, __pyx_int_5); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = PyObject_RichCompare(__pyx_t_2, __pyx_int_0, Py_NE); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_3 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_3 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1343; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_1 = __pyx_t_3;
  __pyx_L4_bool_binop_done:;
  if (__pyx_t_1) {

    /* "_cdecimalfp.pyx":1344
 * cdef int _round_05up(q, r, y):
 *     if q >= 0 and q % 5 == 0 or q < 0 and (q + 1) % 5 != 0:
 *         return 1             # <<<<<<<<<<<<<<
 *     else:
 *         return 0
 */
    __pyx_r = 1;
    goto __pyx_L0;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":1346
 *         return 1
 *     else:
 *         return 0             # <<<<<<<<<<<<<<
 * 
 * 
 */
    __pyx_r = 0;
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1342
 * # quotient negativ and (quotient + 1) not divisible by 5 without remainder
 * # => add 1
 * cdef int _round_05up(q, r, y):             # <<<<<<<<<<<<<<
 *     if q >= 0 and q % 5 == 0 or q < 0 and (q + 1) % 5 != 0:
 *         return 1
 */

  /* function exit code */
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_WriteUnraisable("_cdecimalfp._round_05up", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

/* "_cdecimalfp.pyx":1349
 * 
 * 
 * cdef int _round(q, r, y, rounding=None):             # <<<<<<<<<<<<<<
 *     if rounding is None:
 *         rounding = get_rounding()
 */

static int __pyx_f_11_cdecimalfp__round(PyObject *__pyx_v_q, PyObject *__pyx_v_r, PyObject *__pyx_v_y, struct __pyx_opt_args_11_cdecimalfp__round *__pyx_optional_args) {
  PyObject *__pyx_v_rounding = ((PyObject *)Py_None);
  int __pyx_r;
  __Pyx_RefNannyDeclarations
  int __pyx_t_1;
  int __pyx_t_2;
  PyObject *__pyx_t_3 = NULL;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannySetupContext("_round", 0);
  if (__pyx_optional_args) {
    if (__pyx_optional_args->__pyx_n > 0) {
      __pyx_v_rounding = __pyx_optional_args->rounding;
    }
  }
  __Pyx_INCREF(__pyx_v_rounding);

  /* "_cdecimalfp.pyx":1350
 * 
 * cdef int _round(q, r, y, rounding=None):
 *     if rounding is None:             # <<<<<<<<<<<<<<
 *         rounding = get_rounding()
 *     if rounding == ROUND_HALF_UP:
 */
  __pyx_t_1 = (__pyx_v_rounding == Py_None);
  __pyx_t_2 = (__pyx_t_1 != 0);
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1351
 * cdef int _round(q, r, y, rounding=None):
 *     if rounding is None:
 *         rounding = get_rounding()             # <<<<<<<<<<<<<<
 *     if rounding == ROUND_HALF_UP:
 *         return _round_half_up(q, r, y)
 */
    __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_get_rounding); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __pyx_t_5 = NULL;
    if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_4))) {
      __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4);
      if (likely(__pyx_t_5)) {
        PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4);
        __Pyx_INCREF(__pyx_t_5);
        __Pyx_INCREF(function);
        __Pyx_DECREF_SET(__pyx_t_4, function);
      }
    }
    if (__pyx_t_5) {
      __pyx_t_3 = __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
      __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
    } else {
      __pyx_t_3 = __Pyx_PyObject_CallNoArg(__pyx_t_4); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1351; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
    __Pyx_GOTREF(__pyx_t_3);
    __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
    __Pyx_DECREF_SET(__pyx_v_rounding, __pyx_t_3);
    __pyx_t_3 = 0;
    goto __pyx_L3;
  }
  __pyx_L3:;

  /* "_cdecimalfp.pyx":1352
 *     if rounding is None:
 *         rounding = get_rounding()
 *     if rounding == ROUND_HALF_UP:             # <<<<<<<<<<<<<<
 *         return _round_half_up(q, r, y)
 *     if rounding == ROUND_HALF_EVEN:
 */
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_ROUND_HALF_UP); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_rounding, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1352; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1353
 *         rounding = get_rounding()
 *     if rounding == ROUND_HALF_UP:
 *         return _round_half_up(q, r, y)             # <<<<<<<<<<<<<<
 *     if rounding == ROUND_HALF_EVEN:
 *         return _round_half_even(q, r, y)
 */
    __pyx_r = __pyx_f_11_cdecimalfp__round_half_up(__pyx_v_q, __pyx_v_r, __pyx_v_y);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1354
 *     if rounding == ROUND_HALF_UP:
 *         return _round_half_up(q, r, y)
 *     if rounding == ROUND_HALF_EVEN:             # <<<<<<<<<<<<<<
 *         return _round_half_even(q, r, y)
 *     if rounding == ROUND_HALF_DOWN:
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_ROUND_HALF_EVEN); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_rounding, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1354; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1355
 *         return _round_half_up(q, r, y)
 *     if rounding == ROUND_HALF_EVEN:
 *         return _round_half_even(q, r, y)             # <<<<<<<<<<<<<<
 *     if rounding == ROUND_HALF_DOWN:
 *         return _round_half_down(q, r, y)
 */
    __pyx_r = __pyx_f_11_cdecimalfp__round_half_even(__pyx_v_q, __pyx_v_r, __pyx_v_y);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1356
 *     if rounding == ROUND_HALF_EVEN:
 *         return _round_half_even(q, r, y)
 *     if rounding == ROUND_HALF_DOWN:             # <<<<<<<<<<<<<<
 *         return _round_half_down(q, r, y)
 *     if rounding == ROUND_DOWN:
 */
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_ROUND_HALF_DOWN); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1356; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_rounding, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1356; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1356; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1357
 *         return _round_half_even(q, r, y)
 *     if rounding == ROUND_HALF_DOWN:
 *         return _round_half_down(q, r, y)             # <<<<<<<<<<<<<<
 *     if rounding == ROUND_DOWN:
 *         return _round_down(q, r, y)
 */
    __pyx_r = __pyx_f_11_cdecimalfp__round_half_down(__pyx_v_q, __pyx_v_r, __pyx_v_y);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1358
 *     if rounding == ROUND_HALF_DOWN:
 *         return _round_half_down(q, r, y)
 *     if rounding == ROUND_DOWN:             # <<<<<<<<<<<<<<
 *         return _round_down(q, r, y)
 *     if rounding == ROUND_UP:
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_ROUND_DOWN); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1358; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_rounding, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1358; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1358; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1359
 *         return _round_half_down(q, r, y)
 *     if rounding == ROUND_DOWN:
 *         return _round_down(q, r, y)             # <<<<<<<<<<<<<<
 *     if rounding == ROUND_UP:
 *         return _round_up(q, r, y)
 */
    __pyx_r = __pyx_f_11_cdecimalfp__round_down(__pyx_v_q, __pyx_v_r, __pyx_v_y);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1360
 *     if rounding == ROUND_DOWN:
 *         return _round_down(q, r, y)
 *     if rounding == ROUND_UP:             # <<<<<<<<<<<<<<
 *         return _round_up(q, r, y)
 *     if rounding == ROUND_CEILING:
 */
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_ROUND_UP); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1360; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_rounding, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1360; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1360; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1361
 *         return _round_down(q, r, y)
 *     if rounding == ROUND_UP:
 *         return _round_up(q, r, y)             # <<<<<<<<<<<<<<
 *     if rounding == ROUND_CEILING:
 *         return _round_ceiling(q, r, y)
 */
    __pyx_r = __pyx_f_11_cdecimalfp__round_up(__pyx_v_q, __pyx_v_r, __pyx_v_y);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1362
 *     if rounding == ROUND_UP:
 *         return _round_up(q, r, y)
 *     if rounding == ROUND_CEILING:             # <<<<<<<<<<<<<<
 *         return _round_ceiling(q, r, y)
 *     if rounding == ROUND_FLOOR:
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_ROUND_CEILING); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_rounding, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1362; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1363
 *         return _round_up(q, r, y)
 *     if rounding == ROUND_CEILING:
 *         return _round_ceiling(q, r, y)             # <<<<<<<<<<<<<<
 *     if rounding == ROUND_FLOOR:
 *         return _round_floor(q, r, y)
 */
    __pyx_r = __pyx_f_11_cdecimalfp__round_ceiling(__pyx_v_q, __pyx_v_r, __pyx_v_y);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1364
 *     if rounding == ROUND_CEILING:
 *         return _round_ceiling(q, r, y)
 *     if rounding == ROUND_FLOOR:             # <<<<<<<<<<<<<<
 *         return _round_floor(q, r, y)
 *     if rounding == ROUND_05UP:
 */
  __pyx_t_3 = __Pyx_GetModuleGlobalName(__pyx_n_s_ROUND_FLOOR); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_3);
  __pyx_t_4 = PyObject_RichCompare(__pyx_v_rounding, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_4); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_4); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1364; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1365
 *         return _round_ceiling(q, r, y)
 *     if rounding == ROUND_FLOOR:
 *         return _round_floor(q, r, y)             # <<<<<<<<<<<<<<
 *     if rounding == ROUND_05UP:
 *         return _round_05up(q, r, y)
 */
    __pyx_r = __pyx_f_11_cdecimalfp__round_floor(__pyx_v_q, __pyx_v_r, __pyx_v_y);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1366
 *     if rounding == ROUND_FLOOR:
 *         return _round_floor(q, r, y)
 *     if rounding == ROUND_05UP:             # <<<<<<<<<<<<<<
 *         return _round_05up(q, r, y)
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_ROUND_05UP); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_3 = PyObject_RichCompare(__pyx_v_rounding, __pyx_t_4, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_2 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_2 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1366; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0;
  if (__pyx_t_2) {

    /* "_cdecimalfp.pyx":1367
 *         return _round_floor(q, r, y)
 *     if rounding == ROUND_05UP:
 *         return _round_05up(q, r, y)             # <<<<<<<<<<<<<<
 */
    __pyx_r = __pyx_f_11_cdecimalfp__round_05up(__pyx_v_q, __pyx_v_r, __pyx_v_y);
    goto __pyx_L0;
  }

  /* "_cdecimalfp.pyx":1349
 * 
 * 
 * cdef int _round(q, r, y, rounding=None):             # <<<<<<<<<<<<<<
 *     if rounding is None:
 *         rounding = get_rounding()
 */

  /* function exit code */
  __pyx_r = 0;
  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_3);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_WriteUnraisable("_cdecimalfp._round", __pyx_clineno, __pyx_lineno, __pyx_filename, 0);
  __pyx_r = 0;
  __pyx_L0:;
  __Pyx_XDECREF(__pyx_v_rounding);
  __Pyx_RefNannyFinishContext();
  return __pyx_r;
}

static PyObject *__pyx_tp_new_11_cdecimalfp_Decimal(PyTypeObject *t, PyObject *a, PyObject *k) {
  struct __pyx_obj_11_cdecimalfp_Decimal *p;
  PyObject *o;
  if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) {
    o = (*t->tp_alloc)(t, 0);
  } else {
    o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0);
  }
  if (unlikely(!o)) return 0;
  p = ((struct __pyx_obj_11_cdecimalfp_Decimal *)o);
  p->_value = Py_None; Py_INCREF(Py_None);
  if (unlikely(__pyx_pw_11_cdecimalfp_7Decimal_1__cinit__(o, a, k) < 0)) {
    Py_DECREF(o); o = 0;
  }
  return o;
}

static void __pyx_tp_dealloc_11_cdecimalfp_Decimal(PyObject *o) {
  struct __pyx_obj_11_cdecimalfp_Decimal *p = (struct __pyx_obj_11_cdecimalfp_Decimal *)o;
  #if PY_VERSION_HEX >= 0x030400a1
  if (unlikely(Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) {
    if (PyObject_CallFinalizerFromDealloc(o)) return;
  }
  #endif
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->_value);
  (*Py_TYPE(o)->tp_free)(o);
}

static int __pyx_tp_traverse_11_cdecimalfp_Decimal(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_11_cdecimalfp_Decimal *p = (struct __pyx_obj_11_cdecimalfp_Decimal *)o;
  if (p->_value) {
    e = (*v)(p->_value, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_11_cdecimalfp_Decimal(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_11_cdecimalfp_Decimal *p = (struct __pyx_obj_11_cdecimalfp_Decimal *)o;
  tmp = ((PyObject*)p->_value);
  p->_value = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyMethodDef __pyx_methods_11_cdecimalfp_Decimal[] = {
  {"from_float", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_3from_float, METH_O, __pyx_doc_11_cdecimalfp_7Decimal_2from_float},
  {"from_decimal", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_5from_decimal, METH_O, __pyx_doc_11_cdecimalfp_7Decimal_4from_decimal},
  {"from_real", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_7from_real, METH_VARARGS|METH_KEYWORDS, __pyx_doc_11_cdecimalfp_7Decimal_6from_real},
  {"precision", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_9precision, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_8precision},
  {"magnitude", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_11magnitude, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_10magnitude},
  {"numerator", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_13numerator, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_12numerator},
  {"denominator", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_15denominator, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_14denominator},
  {"real", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_17real, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_16real},
  {"imag", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_19imag, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_18imag},
  {"adjusted", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_21adjusted, METH_VARARGS|METH_KEYWORDS, __pyx_doc_11_cdecimalfp_7Decimal_20adjusted},
  {"as_tuple", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_23as_tuple, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_22as_tuple},
  {"as_integer_ratio", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_25as_integer_ratio, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_24as_integer_ratio},
  {"__copy__", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_27__copy__, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_26__copy__},
  {"__deepcopy__", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_29__deepcopy__, METH_O, 0},
  {"__reduce__", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_31__reduce__, METH_NOARGS, 0},
  {"__setstate__", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_33__setstate__, METH_O, 0},
  {"__lstr__", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_39__lstr__, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_38__lstr__},
  {"__format__", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_41__format__, METH_O, __pyx_doc_11_cdecimalfp_7Decimal_40__format__},
  {"_make_comparable", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_43_make_comparable, METH_O, 0},
  {"__floor__", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_79__floor__, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_78__floor__},
  {"__ceil__", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_81__ceil__, METH_NOARGS, __pyx_doc_11_cdecimalfp_7Decimal_80__ceil__},
  {"__round__", (PyCFunction)__pyx_pw_11_cdecimalfp_7Decimal_83__round__, METH_VARARGS|METH_KEYWORDS, __pyx_doc_11_cdecimalfp_7Decimal_82__round__},
  {0, 0, 0, 0}
};

static PyNumberMethods __pyx_tp_as_number_Decimal = {
  __pyx_pw_11_cdecimalfp_7Decimal_61__add__, /*nb_add*/
  __pyx_pw_11_cdecimalfp_7Decimal_63__sub__, /*nb_subtract*/
  __pyx_pw_11_cdecimalfp_7Decimal_65__mul__, /*nb_multiply*/
  #if PY_MAJOR_VERSION < 3
  __pyx_pw_11_cdecimalfp_7Decimal_67__div__, /*nb_divide*/
  #endif
  __pyx_pw_11_cdecimalfp_7Decimal_75__mod__, /*nb_remainder*/
  __pyx_pw_11_cdecimalfp_7Decimal_71__divmod__, /*nb_divmod*/
  __pyx_pw_11_cdecimalfp_7Decimal_77__pow__, /*nb_power*/
  __pyx_pw_11_cdecimalfp_7Decimal_57__neg__, /*nb_negative*/
  __pyx_pw_11_cdecimalfp_7Decimal_55__pos__, /*nb_positive*/
  __pyx_pw_11_cdecimalfp_7Decimal_59__abs__, /*nb_absolute*/
  __pyx_pw_11_cdecimalfp_7Decimal_49__nonzero__, /*nb_nonzero*/
  0, /*nb_invert*/
  0, /*nb_lshift*/
  0, /*nb_rshift*/
  0, /*nb_and*/
  0, /*nb_xor*/
  0, /*nb_or*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_coerce*/
  #endif
  __pyx_pw_11_cdecimalfp_7Decimal_51__int__, /*nb_int*/
  #if PY_MAJOR_VERSION < 3
  __pyx_pw_11_cdecimalfp_7Decimal_51__int__, /*nb_long*/
  #else
  0, /*reserved*/
  #endif
  __pyx_pw_11_cdecimalfp_7Decimal_53__float__, /*nb_float*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_oct*/
  #endif
  #if PY_MAJOR_VERSION < 3
  0, /*nb_hex*/
  #endif
  0, /*nb_inplace_add*/
  0, /*nb_inplace_subtract*/
  0, /*nb_inplace_multiply*/
  #if PY_MAJOR_VERSION < 3
  0, /*nb_inplace_divide*/
  #endif
  0, /*nb_inplace_remainder*/
  0, /*nb_inplace_power*/
  0, /*nb_inplace_lshift*/
  0, /*nb_inplace_rshift*/
  0, /*nb_inplace_and*/
  0, /*nb_inplace_xor*/
  0, /*nb_inplace_or*/
  __pyx_pw_11_cdecimalfp_7Decimal_73__floordiv__, /*nb_floor_divide*/
  __pyx_pw_11_cdecimalfp_7Decimal_69__truediv__, /*nb_true_divide*/
  0, /*nb_inplace_floor_divide*/
  0, /*nb_inplace_true_divide*/
  0, /*nb_index*/
  #if PY_VERSION_HEX >= 0x03050000
  0, /*nb_matrix_multiply*/
  #endif
  #if PY_VERSION_HEX >= 0x03050000
  0, /*nb_inplace_matrix_multiply*/
  #endif
};

static PyTypeObject __pyx_type_11_cdecimalfp_Decimal = {
  PyVarObject_HEAD_INIT(0, 0)
  "_cdecimalfp.Decimal", /*tp_name*/
  sizeof(struct __pyx_obj_11_cdecimalfp_Decimal), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_11_cdecimalfp_Decimal, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #else
  0, /*reserved*/
  #endif
  __pyx_pw_11_cdecimalfp_7Decimal_35__repr__, /*tp_repr*/
  &__pyx_tp_as_number_Decimal, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  __pyx_pw_11_cdecimalfp_7Decimal_47__hash__, /*tp_hash*/
  0, /*tp_call*/
  __pyx_pw_11_cdecimalfp_7Decimal_37__str__, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  "Decimal number with a given number of fractional digits.\n\n    Args:\n        value (see below): numerical value (default: 0)\n        precision (int): number of fractional digits (default: None)\n\n    If `value` is given, it must either be a string (type `str` or `unicode`\n    in Python 2.x, `bytes` or `str` in Python 3.x), an instance of\n    `number.Integral` (for example `int` or `long` in Python 2.x, `int` in\n    Python 3.x), `number.Rational` (for example `fractions.Fraction`),\n    `decimal.Decimal` or `float` or be convertable to a `float` or an `int`.\n\n    If a string is given as value, it must be a string in one of two formats:\n\n    * [+|-]<int>[.<frac>][<e|E>[+|-]<exp>] or\n\n    * [+|-].<frac>[<e|E>[+|-]<exp>].\n\n    Returns:\n        Decimal: :class:`Decimal` instance derived from `value` according\n            to `precision`\n\n    The value is always adjusted to the given precision or the precision is\n    calculated from the given value, if no precision is given. For performance\n    reasons, in the latter case the conversion of a `numbers.Rational` (like\n    `fractions.Fraction`) or a `float` tries to give an exact result as a\n    :class:`Decimal` only up to a fixed limit of fractional digits. This limit\n    defaults to 32 and is accessible as `decimalfp.LIMIT_PREC`.\n\n    Raises:\n        TypeError: `precision` is given, but not of type `int`.\n        TypeError: `value` is not an instance of the types listed above and\n            not convertable to `float` or `int`.\n        ValueError: `precision` is given, but not >= 0.\n        ValueError: `value` can not be converted to a `Decimal` (with a number\n            of fractional digits <= `LIMIT_PREC` if no `precision` is given).\n\n    :class:`Decimal` instances are immutable.\n    ", /*tp_doc*/
  __pyx_tp_traverse_11_cdecimalfp_Decimal, /*tp_traverse*/
  __pyx_tp_clear_11_cdecimalfp_Decimal, /*tp_clear*/
  __pyx_pw_11_cdecimalfp_7Decimal_45__richcmp__, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  __pyx_methods_11_cdecimalfp_Decimal, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_11_cdecimalfp_Decimal, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *__pyx_freelist_11_cdecimalfp___pyx_scope_struct___iterGrouping[8];
static int __pyx_freecount_11_cdecimalfp___pyx_scope_struct___iterGrouping = 0;

static PyObject *__pyx_tp_new_11_cdecimalfp___pyx_scope_struct___iterGrouping(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) {
  PyObject *o;
  if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_11_cdecimalfp___pyx_scope_struct___iterGrouping > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping)))) {
    o = (PyObject*)__pyx_freelist_11_cdecimalfp___pyx_scope_struct___iterGrouping[--__pyx_freecount_11_cdecimalfp___pyx_scope_struct___iterGrouping];
    memset(o, 0, sizeof(struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping));
    (void) PyObject_INIT(o, t);
    PyObject_GC_Track(o);
  } else {
    o = (*t->tp_alloc)(t, 0);
    if (unlikely(!o)) return 0;
  }
  return o;
}

static void __pyx_tp_dealloc_11_cdecimalfp___pyx_scope_struct___iterGrouping(PyObject *o) {
  struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *p = (struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *)o;
  PyObject_GC_UnTrack(o);
  Py_CLEAR(p->__pyx_v_grouping);
  Py_CLEAR(p->__pyx_v_i);
  Py_CLEAR(p->__pyx_v_l);
  Py_CLEAR(p->__pyx_t_0);
  if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_11_cdecimalfp___pyx_scope_struct___iterGrouping < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping)))) {
    __pyx_freelist_11_cdecimalfp___pyx_scope_struct___iterGrouping[__pyx_freecount_11_cdecimalfp___pyx_scope_struct___iterGrouping++] = ((struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *)o);
  } else {
    (*Py_TYPE(o)->tp_free)(o);
  }
}

static int __pyx_tp_traverse_11_cdecimalfp___pyx_scope_struct___iterGrouping(PyObject *o, visitproc v, void *a) {
  int e;
  struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *p = (struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *)o;
  if (p->__pyx_v_grouping) {
    e = (*v)(p->__pyx_v_grouping, a); if (e) return e;
  }
  if (p->__pyx_v_i) {
    e = (*v)(p->__pyx_v_i, a); if (e) return e;
  }
  if (p->__pyx_v_l) {
    e = (*v)(p->__pyx_v_l, a); if (e) return e;
  }
  if (p->__pyx_t_0) {
    e = (*v)(p->__pyx_t_0, a); if (e) return e;
  }
  return 0;
}

static int __pyx_tp_clear_11_cdecimalfp___pyx_scope_struct___iterGrouping(PyObject *o) {
  PyObject* tmp;
  struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *p = (struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping *)o;
  tmp = ((PyObject*)p->__pyx_v_grouping);
  p->__pyx_v_grouping = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_i);
  p->__pyx_v_i = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_v_l);
  p->__pyx_v_l = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  tmp = ((PyObject*)p->__pyx_t_0);
  p->__pyx_t_0 = Py_None; Py_INCREF(Py_None);
  Py_XDECREF(tmp);
  return 0;
}

static PyTypeObject __pyx_type_11_cdecimalfp___pyx_scope_struct___iterGrouping = {
  PyVarObject_HEAD_INIT(0, 0)
  "_cdecimalfp.__pyx_scope_struct___iterGrouping", /*tp_name*/
  sizeof(struct __pyx_obj_11_cdecimalfp___pyx_scope_struct___iterGrouping), /*tp_basicsize*/
  0, /*tp_itemsize*/
  __pyx_tp_dealloc_11_cdecimalfp___pyx_scope_struct___iterGrouping, /*tp_dealloc*/
  0, /*tp_print*/
  0, /*tp_getattr*/
  0, /*tp_setattr*/
  #if PY_MAJOR_VERSION < 3
  0, /*tp_compare*/
  #else
  0, /*reserved*/
  #endif
  0, /*tp_repr*/
  0, /*tp_as_number*/
  0, /*tp_as_sequence*/
  0, /*tp_as_mapping*/
  0, /*tp_hash*/
  0, /*tp_call*/
  0, /*tp_str*/
  0, /*tp_getattro*/
  0, /*tp_setattro*/
  0, /*tp_as_buffer*/
  Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/
  0, /*tp_doc*/
  __pyx_tp_traverse_11_cdecimalfp___pyx_scope_struct___iterGrouping, /*tp_traverse*/
  __pyx_tp_clear_11_cdecimalfp___pyx_scope_struct___iterGrouping, /*tp_clear*/
  0, /*tp_richcompare*/
  0, /*tp_weaklistoffset*/
  0, /*tp_iter*/
  0, /*tp_iternext*/
  0, /*tp_methods*/
  0, /*tp_members*/
  0, /*tp_getset*/
  0, /*tp_base*/
  0, /*tp_dict*/
  0, /*tp_descr_get*/
  0, /*tp_descr_set*/
  0, /*tp_dictoffset*/
  0, /*tp_init*/
  0, /*tp_alloc*/
  __pyx_tp_new_11_cdecimalfp___pyx_scope_struct___iterGrouping, /*tp_new*/
  0, /*tp_free*/
  0, /*tp_is_gc*/
  0, /*tp_bases*/
  0, /*tp_mro*/
  0, /*tp_cache*/
  0, /*tp_subclasses*/
  0, /*tp_weaklist*/
  0, /*tp_del*/
  0, /*tp_version_tag*/
  #if PY_VERSION_HEX >= 0x030400a1
  0, /*tp_finalize*/
  #endif
};

static PyMethodDef __pyx_methods[] = {
  {0, 0, 0, 0}
};

#if PY_MAJOR_VERSION >= 3
static struct PyModuleDef __pyx_moduledef = {
  #if PY_VERSION_HEX < 0x03020000
    { PyObject_HEAD_INIT(NULL) NULL, 0, NULL },
  #else
    PyModuleDef_HEAD_INIT,
  #endif
    "_cdecimalfp",
    __pyx_k_Decimal_fixed_point_arithmetic, /* m_doc */
    -1, /* m_size */
    __pyx_methods /* m_methods */,
    NULL, /* m_reload */
    NULL, /* m_traverse */
    NULL, /* m_clear */
    NULL /* m_free */
};
#endif

static __Pyx_StringTabEntry __pyx_string_tab[] = {
  {&__pyx_kp_s_0, __pyx_k_0, sizeof(__pyx_k_0), 0, 0, 1, 0},
  {&__pyx_kp_s_3rd_argument_not_allowed_unless, __pyx_k_3rd_argument_not_allowed_unless, sizeof(__pyx_k_3rd_argument_not_allowed_unless), 0, 0, 1, 0},
  {&__pyx_kp_s_A_P_fill_P_align_P_sign_P_zerop, __pyx_k_A_P_fill_P_align_P_sign_P_zerop, sizeof(__pyx_k_A_P_fill_P_align_P_sign_P_zerop), 0, 0, 1, 0},
  {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1},
  {&__pyx_n_s_CHAR_MAX, __pyx_k_CHAR_MAX, sizeof(__pyx_k_CHAR_MAX), 0, 0, 1, 1},
  {&__pyx_kp_s_Can_t_convert_s_exactly_to_Decim, __pyx_k_Can_t_convert_s_exactly_to_Decim, sizeof(__pyx_k_Can_t_convert_s_exactly_to_Decim), 0, 0, 1, 0},
  {&__pyx_kp_s_Can_t_convert_s_to_Decimal, __pyx_k_Can_t_convert_s_to_Decimal, sizeof(__pyx_k_Can_t_convert_s_to_Decimal), 0, 0, 1, 0},
  {&__pyx_n_s_Complex, __pyx_k_Complex, sizeof(__pyx_k_Complex), 0, 0, 1, 1},
  {&__pyx_n_s_DFLT_ROUNDING, __pyx_k_DFLT_ROUNDING, sizeof(__pyx_k_DFLT_ROUNDING), 0, 0, 1, 1},
  {&__pyx_n_s_Decimal, __pyx_k_Decimal, sizeof(__pyx_k_Decimal), 0, 0, 1, 1},
  {&__pyx_kp_s_Decimal_s, __pyx_k_Decimal_s, sizeof(__pyx_k_Decimal_s), 0, 0, 1, 0},
  {&__pyx_kp_s_Decimal_s_s, __pyx_k_Decimal_s_s, sizeof(__pyx_k_Decimal_s_s), 0, 0, 1, 0},
  {&__pyx_n_s_Fraction, __pyx_k_Fraction, sizeof(__pyx_k_Fraction), 0, 0, 1, 1},
  {&__pyx_n_s_Integral, __pyx_k_Integral, sizeof(__pyx_k_Integral), 0, 0, 1, 1},
  {&__pyx_kp_s_Invalid_format_specifier, __pyx_k_Invalid_format_specifier, sizeof(__pyx_k_Invalid_format_specifier), 0, 0, 1, 0},
  {&__pyx_n_s_NotImplemented, __pyx_k_NotImplemented, sizeof(__pyx_k_NotImplemented), 0, 0, 1, 1},
  {&__pyx_n_s_OverflowError, __pyx_k_OverflowError, sizeof(__pyx_k_OverflowError), 0, 0, 1, 1},
  {&__pyx_kp_s_Precision_must_be_0, __pyx_k_Precision_must_be_0, sizeof(__pyx_k_Precision_must_be_0), 0, 0, 1, 0},
  {&__pyx_kp_s_Precision_must_be_of_type_int, __pyx_k_Precision_must_be_of_type_int, sizeof(__pyx_k_Precision_must_be_of_type_int), 0, 0, 1, 0},
  {&__pyx_n_s_ROUND_05UP, __pyx_k_ROUND_05UP, sizeof(__pyx_k_ROUND_05UP), 0, 0, 1, 1},
  {&__pyx_n_s_ROUND_CEILING, __pyx_k_ROUND_CEILING, sizeof(__pyx_k_ROUND_CEILING), 0, 0, 1, 1},
  {&__pyx_n_s_ROUND_DOWN, __pyx_k_ROUND_DOWN, sizeof(__pyx_k_ROUND_DOWN), 0, 0, 1, 1},
  {&__pyx_n_s_ROUND_FLOOR, __pyx_k_ROUND_FLOOR, sizeof(__pyx_k_ROUND_FLOOR), 0, 0, 1, 1},
  {&__pyx_n_s_ROUND_HALF_DOWN, __pyx_k_ROUND_HALF_DOWN, sizeof(__pyx_k_ROUND_HALF_DOWN), 0, 0, 1, 1},
  {&__pyx_n_s_ROUND_HALF_EVEN, __pyx_k_ROUND_HALF_EVEN, sizeof(__pyx_k_ROUND_HALF_EVEN), 0, 0, 1, 1},
  {&__pyx_n_s_ROUND_HALF_UP, __pyx_k_ROUND_HALF_UP, sizeof(__pyx_k_ROUND_HALF_UP), 0, 0, 1, 1},
  {&__pyx_n_s_ROUND_UP, __pyx_k_ROUND_UP, sizeof(__pyx_k_ROUND_UP), 0, 0, 1, 1},
  {&__pyx_n_s_Rational, __pyx_k_Rational, sizeof(__pyx_k_Rational), 0, 0, 1, 1},
  {&__pyx_n_s_Real, __pyx_k_Real, sizeof(__pyx_k_Real), 0, 0, 1, 1},
  {&__pyx_n_s_StdLibDecimal, __pyx_k_StdLibDecimal, sizeof(__pyx_k_StdLibDecimal), 0, 0, 1, 1},
  {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1},
  {&__pyx_n_s_VERBOSE, __pyx_k_VERBOSE, sizeof(__pyx_k_VERBOSE), 0, 0, 1, 1},
  {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1},
  {&__pyx_kp_s__27, __pyx_k__27, sizeof(__pyx_k__27), 0, 0, 1, 0},
  {&__pyx_kp_s__28, __pyx_k__28, sizeof(__pyx_k__28), 0, 0, 1, 0},
  {&__pyx_kp_s__29, __pyx_k__29, sizeof(__pyx_k__29), 0, 0, 1, 0},
  {&__pyx_kp_b__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 0, 0},
  {&__pyx_kp_s__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 1, 0},
  {&__pyx_kp_s__6, __pyx_k__6, sizeof(__pyx_k__6), 0, 0, 1, 0},
  {&__pyx_kp_b__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 0, 0, 0},
  {&__pyx_kp_s__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 0, 1, 0},
  {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0},
  {&__pyx_kp_s__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 0, 1, 0},
  {&__pyx_n_s_adjusted, __pyx_k_adjusted, sizeof(__pyx_k_adjusted), 0, 0, 1, 1},
  {&__pyx_n_s_align, __pyx_k_align, sizeof(__pyx_k_align), 0, 0, 1, 1},
  {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1},
  {&__pyx_n_s_as_integer_ratio, __pyx_k_as_integer_ratio, sizeof(__pyx_k_as_integer_ratio), 0, 0, 1, 1},
  {&__pyx_n_s_as_tuple, __pyx_k_as_tuple, sizeof(__pyx_k_as_tuple), 0, 0, 1, 1},
  {&__pyx_n_s_cdecimalfp, __pyx_k_cdecimalfp, sizeof(__pyx_k_cdecimalfp), 0, 0, 1, 1},
  {&__pyx_n_s_cinit___locals_lambda, __pyx_k_cinit___locals_lambda, sizeof(__pyx_k_cinit___locals_lambda), 0, 0, 1, 1},
  {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1},
  {&__pyx_n_s_compile, __pyx_k_compile, sizeof(__pyx_k_compile), 0, 0, 1, 1},
  {&__pyx_n_s_copy, __pyx_k_copy, sizeof(__pyx_k_copy), 0, 0, 1, 1},
  {&__pyx_n_s_decimal, __pyx_k_decimal, sizeof(__pyx_k_decimal), 0, 0, 1, 1},
  {&__pyx_n_s_decimal_point, __pyx_k_decimal_point, sizeof(__pyx_k_decimal_point), 0, 0, 1, 1},
  {&__pyx_n_s_decimalfp, __pyx_k_decimalfp, sizeof(__pyx_k_decimalfp), 0, 0, 1, 1},
  {&__pyx_n_s_denominator, __pyx_k_denominator, sizeof(__pyx_k_denominator), 0, 0, 1, 1},
  {&__pyx_n_s_dfltFormatParams, __pyx_k_dfltFormatParams, sizeof(__pyx_k_dfltFormatParams), 0, 0, 1, 1},
  {&__pyx_n_s_digits, __pyx_k_digits, sizeof(__pyx_k_digits), 0, 0, 1, 1},
  {&__pyx_n_s_divmod, __pyx_k_divmod, sizeof(__pyx_k_divmod), 0, 0, 1, 1},
  {&__pyx_n_s_encode, __pyx_k_encode, sizeof(__pyx_k_encode), 0, 0, 1, 1},
  {&__pyx_n_s_exact, __pyx_k_exact, sizeof(__pyx_k_exact), 0, 0, 1, 1},
  {&__pyx_n_s_exp, __pyx_k_exp, sizeof(__pyx_k_exp), 0, 0, 1, 1},
  {&__pyx_n_s_f, __pyx_k_f, sizeof(__pyx_k_f), 0, 0, 1, 1},
  {&__pyx_n_s_fill, __pyx_k_fill, sizeof(__pyx_k_fill), 0, 0, 1, 1},
  {&__pyx_n_s_floor, __pyx_k_floor, sizeof(__pyx_k_floor), 0, 0, 1, 1},
  {&__pyx_n_s_fmtAlign, __pyx_k_fmtAlign, sizeof(__pyx_k_fmtAlign), 0, 0, 1, 1},
  {&__pyx_n_s_fmtDecimalPoint, __pyx_k_fmtDecimalPoint, sizeof(__pyx_k_fmtDecimalPoint), 0, 0, 1, 1},
  {&__pyx_n_s_fmtFill, __pyx_k_fmtFill, sizeof(__pyx_k_fmtFill), 0, 0, 1, 1},
  {&__pyx_n_s_fmtGrouping, __pyx_k_fmtGrouping, sizeof(__pyx_k_fmtGrouping), 0, 0, 1, 1},
  {&__pyx_n_s_fmtMinWidth, __pyx_k_fmtMinWidth, sizeof(__pyx_k_fmtMinWidth), 0, 0, 1, 1},
  {&__pyx_n_s_fmtPrecision, __pyx_k_fmtPrecision, sizeof(__pyx_k_fmtPrecision), 0, 0, 1, 1},
  {&__pyx_n_s_fmtSign, __pyx_k_fmtSign, sizeof(__pyx_k_fmtSign), 0, 0, 1, 1},
  {&__pyx_n_s_fmtThousandsSep, __pyx_k_fmtThousandsSep, sizeof(__pyx_k_fmtThousandsSep), 0, 0, 1, 1},
  {&__pyx_n_s_fmtType, __pyx_k_fmtType, sizeof(__pyx_k_fmtType), 0, 0, 1, 1},
  {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1},
  {&__pyx_n_s_formatSpec, __pyx_k_formatSpec, sizeof(__pyx_k_formatSpec), 0, 0, 1, 1},
  {&__pyx_n_s_format_2, __pyx_k_format_2, sizeof(__pyx_k_format_2), 0, 0, 1, 1},
  {&__pyx_n_s_frac, __pyx_k_frac, sizeof(__pyx_k_frac), 0, 0, 1, 1},
  {&__pyx_n_s_fractions, __pyx_k_fractions, sizeof(__pyx_k_fractions), 0, 0, 1, 1},
  {&__pyx_n_s_from_decimal, __pyx_k_from_decimal, sizeof(__pyx_k_from_decimal), 0, 0, 1, 1},
  {&__pyx_n_s_from_float, __pyx_k_from_float, sizeof(__pyx_k_from_float), 0, 0, 1, 1},
  {&__pyx_n_s_from_real, __pyx_k_from_real, sizeof(__pyx_k_from_real), 0, 0, 1, 1},
  {&__pyx_n_s_functools, __pyx_k_functools, sizeof(__pyx_k_functools), 0, 0, 1, 1},
  {&__pyx_n_s_gcd, __pyx_k_gcd, sizeof(__pyx_k_gcd), 0, 0, 1, 1},
  {&__pyx_n_s_getFormatParams, __pyx_k_getFormatParams, sizeof(__pyx_k_getFormatParams), 0, 0, 1, 1},
  {&__pyx_n_s_get_limit_prec, __pyx_k_get_limit_prec, sizeof(__pyx_k_get_limit_prec), 0, 0, 1, 1},
  {&__pyx_n_s_get_rounding, __pyx_k_get_rounding, sizeof(__pyx_k_get_rounding), 0, 0, 1, 1},
  {&__pyx_n_s_group, __pyx_k_group, sizeof(__pyx_k_group), 0, 0, 1, 1},
  {&__pyx_n_s_grouping, __pyx_k_grouping, sizeof(__pyx_k_grouping), 0, 0, 1, 1},
  {&__pyx_kp_s_home_ma_work_decimalfp_work__cd, __pyx_k_home_ma_work_decimalfp_work__cd, sizeof(__pyx_k_home_ma_work_decimalfp_work__cd), 0, 0, 1, 0},
  {&__pyx_kp_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 0},
  {&__pyx_n_s_i_2, __pyx_k_i_2, sizeof(__pyx_k_i_2), 0, 0, 1, 1},
  {&__pyx_n_s_imag, __pyx_k_imag, sizeof(__pyx_k_imag), 0, 0, 1, 1},
  {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1},
  {&__pyx_n_s_int, __pyx_k_int, sizeof(__pyx_k_int), 0, 0, 1, 1},
  {&__pyx_n_s_is_finite, __pyx_k_is_finite, sizeof(__pyx_k_is_finite), 0, 0, 1, 1},
  {&__pyx_n_s_iterGrouping, __pyx_k_iterGrouping, sizeof(__pyx_k_iterGrouping), 0, 0, 1, 1},
  {&__pyx_n_s_j, __pyx_k_j, sizeof(__pyx_k_j), 0, 0, 1, 1},
  {&__pyx_n_s_join, __pyx_k_join, sizeof(__pyx_k_join), 0, 0, 1, 1},
  {&__pyx_n_s_l, __pyx_k_l, sizeof(__pyx_k_l), 0, 0, 1, 1},
  {&__pyx_n_s_lconv, __pyx_k_lconv, sizeof(__pyx_k_lconv), 0, 0, 1, 1},
  {&__pyx_n_s_limit, __pyx_k_limit, sizeof(__pyx_k_limit), 0, 0, 1, 1},
  {&__pyx_n_s_locale, __pyx_k_locale, sizeof(__pyx_k_locale), 0, 0, 1, 1},
  {&__pyx_n_s_localeconv, __pyx_k_localeconv, sizeof(__pyx_k_localeconv), 0, 0, 1, 1},
  {&__pyx_n_s_log10, __pyx_k_log10, sizeof(__pyx_k_log10), 0, 0, 1, 1},
  {&__pyx_n_s_m, __pyx_k_m, sizeof(__pyx_k_m), 0, 0, 1, 1},
  {&__pyx_n_s_magnitude, __pyx_k_magnitude, sizeof(__pyx_k_magnitude), 0, 0, 1, 1},
  {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1},
  {&__pyx_n_s_make_comparable, __pyx_k_make_comparable, sizeof(__pyx_k_make_comparable), 0, 0, 1, 1},
  {&__pyx_n_s_match, __pyx_k_match, sizeof(__pyx_k_match), 0, 0, 1, 1},
  {&__pyx_n_s_math, __pyx_k_math, sizeof(__pyx_k_math), 0, 0, 1, 1},
  {&__pyx_n_s_minWidth, __pyx_k_minWidth, sizeof(__pyx_k_minWidth), 0, 0, 1, 1},
  {&__pyx_n_s_minimumwidth, __pyx_k_minimumwidth, sizeof(__pyx_k_minimumwidth), 0, 0, 1, 1},
  {&__pyx_n_s_mul, __pyx_k_mul, sizeof(__pyx_k_mul), 0, 0, 1, 1},
  {&__pyx_n_s_n, __pyx_k_n, sizeof(__pyx_k_n), 0, 0, 1, 1},
  {&__pyx_n_s_nDigits, __pyx_k_nDigits, sizeof(__pyx_k_nDigits), 0, 0, 1, 1},
  {&__pyx_n_s_numbers, __pyx_k_numbers, sizeof(__pyx_k_numbers), 0, 0, 1, 1},
  {&__pyx_n_s_numerator, __pyx_k_numerator, sizeof(__pyx_k_numerator), 0, 0, 1, 1},
  {&__pyx_n_s_onlyfrac, __pyx_k_onlyfrac, sizeof(__pyx_k_onlyfrac), 0, 0, 1, 1},
  {&__pyx_n_s_padDigits, __pyx_k_padDigits, sizeof(__pyx_k_padDigits), 0, 0, 1, 1},
  {&__pyx_n_s_parseFormatSpec, __pyx_k_parseFormatSpec, sizeof(__pyx_k_parseFormatSpec), 0, 0, 1, 1},
  {&__pyx_n_s_parseString, __pyx_k_parseString, sizeof(__pyx_k_parseString), 0, 0, 1, 1},
  {&__pyx_n_s_pattern, __pyx_k_pattern, sizeof(__pyx_k_pattern), 0, 0, 1, 1},
  {&__pyx_n_s_precision, __pyx_k_precision, sizeof(__pyx_k_precision), 0, 0, 1, 1},
  {&__pyx_n_s_property, __pyx_k_property, sizeof(__pyx_k_property), 0, 0, 1, 1},
  {&__pyx_n_s_py_bytes, __pyx_k_py_bytes, sizeof(__pyx_k_py_bytes), 0, 0, 1, 1},
  {&__pyx_n_s_py_str, __pyx_k_py_str, sizeof(__pyx_k_py_str), 0, 0, 1, 1},
  {&__pyx_n_s_r, __pyx_k_r, sizeof(__pyx_k_r), 0, 0, 1, 1},
  {&__pyx_n_s_raw, __pyx_k_raw, sizeof(__pyx_k_raw), 0, 0, 1, 1},
  {&__pyx_n_s_re, __pyx_k_re, sizeof(__pyx_k_re), 0, 0, 1, 1},
  {&__pyx_n_s_real, __pyx_k_real, sizeof(__pyx_k_real), 0, 0, 1, 1},
  {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1},
  {&__pyx_n_s_register, __pyx_k_register, sizeof(__pyx_k_register), 0, 0, 1, 1},
  {&__pyx_n_s_reversed, __pyx_k_reversed, sizeof(__pyx_k_reversed), 0, 0, 1, 1},
  {&__pyx_n_s_rounding, __pyx_k_rounding, sizeof(__pyx_k_rounding), 0, 0, 1, 1},
  {&__pyx_kp_s_s0_s_s, __pyx_k_s0_s_s, sizeof(__pyx_k_s0_s_s), 0, 0, 1, 0},
  {&__pyx_kp_s_s_P_sign_P_int_d_P_frac_d_P_onl, __pyx_k_s_P_sign_P_int_d_P_frac_d_P_onl, sizeof(__pyx_k_s_P_sign_P_int_d_P_frac_d_P_onl), 0, 0, 1, 0},
  {&__pyx_kp_s_s_i_0_i, __pyx_k_s_i_0_i, sizeof(__pyx_k_s_i_0_i), 0, 0, 1, 0},
  {&__pyx_kp_s_s_is_not_a_Decimal, __pyx_k_s_is_not_a_Decimal, sizeof(__pyx_k_s_is_not_a_Decimal), 0, 0, 1, 0},
  {&__pyx_kp_s_s_is_not_a_Real, __pyx_k_s_is_not_a_Real, sizeof(__pyx_k_s_is_not_a_Real), 0, 0, 1, 0},
  {&__pyx_kp_s_s_is_not_a_float, __pyx_k_s_is_not_a_float, sizeof(__pyx_k_s_is_not_a_float), 0, 0, 1, 0},
  {&__pyx_kp_s_s_s_i, __pyx_k_s_s_i, sizeof(__pyx_k_s_s_i), 0, 0, 1, 0},
  {&__pyx_kp_s_s_s_s, __pyx_k_s_s_s, sizeof(__pyx_k_s_s_s), 0, 0, 1, 0},
  {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1},
  {&__pyx_n_s_sep, __pyx_k_sep, sizeof(__pyx_k_sep), 0, 0, 1, 1},
  {&__pyx_n_s_sign, __pyx_k_sign, sizeof(__pyx_k_sign), 0, 0, 1, 1},
  {&__pyx_n_s_slices, __pyx_k_slices, sizeof(__pyx_k_slices), 0, 0, 1, 1},
  {&__pyx_n_s_str_types, __pyx_k_str_types, sizeof(__pyx_k_str_types), 0, 0, 1, 1},
  {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1},
  {&__pyx_n_s_thousands_sep, __pyx_k_thousands_sep, sizeof(__pyx_k_thousands_sep), 0, 0, 1, 1},
  {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1},
  {&__pyx_n_s_type, __pyx_k_type, sizeof(__pyx_k_type), 0, 0, 1, 1},
  {&__pyx_n_s_value, __pyx_k_value, sizeof(__pyx_k_value), 0, 0, 1, 1},
  {&__pyx_n_s_x, __pyx_k_x, sizeof(__pyx_k_x), 0, 0, 1, 1},
  {&__pyx_n_s_y, __pyx_k_y, sizeof(__pyx_k_y), 0, 0, 1, 1},
  {&__pyx_n_s_zeropad, __pyx_k_zeropad, sizeof(__pyx_k_zeropad), 0, 0, 1, 1},
  {0, 0, 0, 0, 0, 0, 0}
};
static int __Pyx_InitCachedBuiltins(void) {
  __pyx_builtin_property = __Pyx_GetBuiltinName(__pyx_n_s_property); if (!__pyx_builtin_property) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 141; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_OverflowError = __Pyx_GetBuiltinName(__pyx_n_s_OverflowError); if (!__pyx_builtin_OverflowError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 186; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_format = __Pyx_GetBuiltinName(__pyx_n_s_format); if (!__pyx_builtin_format) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 480; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_NotImplemented = __Pyx_GetBuiltinName(__pyx_n_s_NotImplemented); if (!__pyx_builtin_NotImplemented) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 518; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_builtin_reversed = __Pyx_GetBuiltinName(__pyx_n_s_reversed); if (!__pyx_builtin_reversed) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 887; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  return 0;
  __pyx_L1_error:;
  return -1;
}

static int __Pyx_InitCachedConstants(void) {
  __Pyx_RefNannyDeclarations
  __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0);

  /* "_cdecimalfp.pyx":120
 *         else:
 *             if not isinstance(precision, int):
 *                 raise TypeError("Precision must be of <type 'int'>.")             # <<<<<<<<<<<<<<
 *             if precision < 0:
 *                 raise ValueError("Precision must be >= 0.")
 */
  __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_s_Precision_must_be_of_type_int); if (unlikely(!__pyx_tuple_)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 120; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple_);
  __Pyx_GIVEREF(__pyx_tuple_);

  /* "_cdecimalfp.pyx":122
 *                 raise TypeError("Precision must be of <type 'int'>.")
 *             if precision < 0:
 *                 raise ValueError("Precision must be >= 0.")             # <<<<<<<<<<<<<<
 *             if value is None:
 *                 self._value = 0
 */
  __pyx_tuple__2 = PyTuple_Pack(1, __pyx_kp_s_Precision_must_be_0); if (unlikely(!__pyx_tuple__2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 122; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__2);
  __Pyx_GIVEREF(__pyx_tuple__2);

  /* "_cdecimalfp.pyx":387
 * 
 *     def __reduce__(self):
 *         return (Decimal, (None, None), (self._value, self._precision))             # <<<<<<<<<<<<<<
 * 
 *     def __setstate__(self, state):
 */
  __pyx_tuple__3 = PyTuple_Pack(2, Py_None, Py_None); if (unlikely(!__pyx_tuple__3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 387; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__3);
  __Pyx_GIVEREF(__pyx_tuple__3);

  /* "_cdecimalfp.pyx":425
 *     def __lstr__(self):
 *         """locale.str(self)"""
 *         return self.__format__('n')             # <<<<<<<<<<<<<<
 * 
 *     def __format__(self, fmtSpec):
 */
  __pyx_tuple__5 = PyTuple_Pack(1, __pyx_n_s_n); if (unlikely(!__pyx_tuple__5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 425; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__5);
  __Pyx_GIVEREF(__pyx_tuple__5);

  /* "_cdecimalfp.pyx":640
 *         """
 *         if mod is not None:
 *             raise TypeError("3rd argument not allowed unless all arguments "             # <<<<<<<<<<<<<<
 *                             "are integers")
 *         if isinstance(x, Decimal):
 */
  __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_3rd_argument_not_allowed_unless); if (unlikely(!__pyx_tuple__9)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 640; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__9);
  __Pyx_GIVEREF(__pyx_tuple__9);

  /* "_cdecimalfp.pyx":711
 *     if parsed is None:
 *         raise ValueError
 *     sExp = parsed.group('exp')             # <<<<<<<<<<<<<<
 *     if sExp:
 *         exp = atoi(sExp)
 */
  __pyx_tuple__10 = PyTuple_Pack(1, __pyx_n_s_exp); if (unlikely(!__pyx_tuple__10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 711; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__10);
  __Pyx_GIVEREF(__pyx_tuple__10);

  /* "_cdecimalfp.pyx":716
 *     else:
 *         exp = 0
 *     sInt = parsed.group('int')             # <<<<<<<<<<<<<<
 *     if sInt:
 *         nInt = PyLong_FromString(sInt, &pend, 10)
 */
  __pyx_tuple__11 = PyTuple_Pack(1, __pyx_n_s_int); if (unlikely(!__pyx_tuple__11)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 716; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__11);
  __Pyx_GIVEREF(__pyx_tuple__11);

  /* "_cdecimalfp.pyx":719
 *     if sInt:
 *         nInt = PyLong_FromString(sInt, &pend, 10)
 *         sFrac = parsed.group('frac')             # <<<<<<<<<<<<<<
 *     else:
 *         nInt = PyLong_FromLong(0)
 */
  __pyx_tuple__12 = PyTuple_Pack(1, __pyx_n_s_frac); if (unlikely(!__pyx_tuple__12)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 719; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__12);
  __Pyx_GIVEREF(__pyx_tuple__12);

  /* "_cdecimalfp.pyx":722
 *     else:
 *         nInt = PyLong_FromLong(0)
 *         sFrac = parsed.group('onlyfrac')             # <<<<<<<<<<<<<<
 *     if sFrac:
 *         nFrac = PyLong_FromString(sFrac, &pend, 10)
 */
  __pyx_tuple__13 = PyTuple_Pack(1, __pyx_n_s_onlyfrac); if (unlikely(!__pyx_tuple__13)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 722; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__13);
  __Pyx_GIVEREF(__pyx_tuple__13);

  /* "_cdecimalfp.pyx":731
 *     coeff = nInt * base10pow(shift10) + nFrac
 *     exp -= shift10
 *     if parsed.group('sign') == b'-':             # <<<<<<<<<<<<<<
 *         coeff = -coeff
 *     _dec_from_coeff_exp(dec, coeff, exp, prec)
 */
  __pyx_tuple__14 = PyTuple_Pack(1, __pyx_n_s_sign); if (unlikely(!__pyx_tuple__14)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 731; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__14);
  __Pyx_GIVEREF(__pyx_tuple__14);

  /* "_cdecimalfp.pyx":833
 *     if m is None:
 *         raise ValueError("Invalid format specifier: " + formatSpec)
 *     fill = m.group('fill')             # <<<<<<<<<<<<<<
 *     zeropad = m.group('zeropad')
 *     if fill:                            # fill overrules zeropad
 */
  __pyx_tuple__15 = PyTuple_Pack(1, __pyx_n_s_fill); if (unlikely(!__pyx_tuple__15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__15);
  __Pyx_GIVEREF(__pyx_tuple__15);

  /* "_cdecimalfp.pyx":834
 *         raise ValueError("Invalid format specifier: " + formatSpec)
 *     fill = m.group('fill')
 *     zeropad = m.group('zeropad')             # <<<<<<<<<<<<<<
 *     if fill:                            # fill overrules zeropad
 *         fmtFill = fill
 */
  __pyx_tuple__16 = PyTuple_Pack(1, __pyx_n_s_zeropad); if (unlikely(!__pyx_tuple__16)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__16);
  __Pyx_GIVEREF(__pyx_tuple__16);

  /* "_cdecimalfp.pyx":837
 *     if fill:                            # fill overrules zeropad
 *         fmtFill = fill
 *         fmtAlign = m.group('align')             # <<<<<<<<<<<<<<
 *     elif zeropad:                       # zeropad overrules align
 *         fmtFill = '0'
 */
  __pyx_tuple__17 = PyTuple_Pack(1, __pyx_n_s_align); if (unlikely(!__pyx_tuple__17)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__17);
  __Pyx_GIVEREF(__pyx_tuple__17);

  /* "_cdecimalfp.pyx":843
 *     else:
 *         fmtFill = _dfltFormatParams['fill']
 *         fmtAlign = m.group('align') or _dfltFormatParams['align']             # <<<<<<<<<<<<<<
 *     fmtSign = m.group('sign') or _dfltFormatParams['sign']
 *     minimumwidth = m.group('minimumwidth')
 */
  __pyx_tuple__18 = PyTuple_Pack(1, __pyx_n_s_align); if (unlikely(!__pyx_tuple__18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 843; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__18);
  __Pyx_GIVEREF(__pyx_tuple__18);

  /* "_cdecimalfp.pyx":844
 *         fmtFill = _dfltFormatParams['fill']
 *         fmtAlign = m.group('align') or _dfltFormatParams['align']
 *     fmtSign = m.group('sign') or _dfltFormatParams['sign']             # <<<<<<<<<<<<<<
 *     minimumwidth = m.group('minimumwidth')
 *     if minimumwidth:
 */
  __pyx_tuple__19 = PyTuple_Pack(1, __pyx_n_s_sign); if (unlikely(!__pyx_tuple__19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__19);
  __Pyx_GIVEREF(__pyx_tuple__19);

  /* "_cdecimalfp.pyx":845
 *         fmtAlign = m.group('align') or _dfltFormatParams['align']
 *     fmtSign = m.group('sign') or _dfltFormatParams['sign']
 *     minimumwidth = m.group('minimumwidth')             # <<<<<<<<<<<<<<
 *     if minimumwidth:
 *         fmtMinWidth = int(minimumwidth)
 */
  __pyx_tuple__20 = PyTuple_Pack(1, __pyx_n_s_minimumwidth); if (unlikely(!__pyx_tuple__20)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 845; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__20);
  __Pyx_GIVEREF(__pyx_tuple__20);

  /* "_cdecimalfp.pyx":850
 *     else:
 *         fmtMinWidth = _dfltFormatParams['minimumwidth']
 *     fmtType = m.group('type') or _dfltFormatParams['type']             # <<<<<<<<<<<<<<
 *     if fmtType == 'n':
 *         lconv = locale.localeconv()
 */
  __pyx_tuple__21 = PyTuple_Pack(1, __pyx_n_s_type); if (unlikely(!__pyx_tuple__21)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 850; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__21);
  __Pyx_GIVEREF(__pyx_tuple__21);

  /* "_cdecimalfp.pyx":853
 *     if fmtType == 'n':
 *         lconv = locale.localeconv()
 *         fmtThousandsSep = m.group('thousands_sep') and lconv['thousands_sep']             # <<<<<<<<<<<<<<
 *         fmtGrouping = lconv['grouping']
 *         fmtDecimalPoint = lconv['decimal_point']
 */
  __pyx_tuple__22 = PyTuple_Pack(1, __pyx_n_s_thousands_sep); if (unlikely(!__pyx_tuple__22)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 853; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__22);
  __Pyx_GIVEREF(__pyx_tuple__22);

  /* "_cdecimalfp.pyx":857
 *         fmtDecimalPoint = lconv['decimal_point']
 *     else:
 *         fmtThousandsSep = (m.group('thousands_sep') or             # <<<<<<<<<<<<<<
 *                            _dfltFormatParams['thousands_sep'])
 *         fmtGrouping = _dfltFormatParams['grouping']
 */
  __pyx_tuple__23 = PyTuple_Pack(1, __pyx_n_s_thousands_sep); if (unlikely(!__pyx_tuple__23)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 857; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__23);
  __Pyx_GIVEREF(__pyx_tuple__23);

  /* "_cdecimalfp.pyx":861
 *         fmtGrouping = _dfltFormatParams['grouping']
 *         fmtDecimalPoint = _dfltFormatParams['decimal_point']
 *     precision = m.group('precision')             # <<<<<<<<<<<<<<
 *     if precision:
 *         fmtPrecision = int(precision)
 */
  __pyx_tuple__24 = PyTuple_Pack(1, __pyx_n_s_precision); if (unlikely(!__pyx_tuple__24)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__24);
  __Pyx_GIVEREF(__pyx_tuple__24);

  /* "_cdecimalfp.pyx":895
 * def _iterGrouping(grouping):
 *     l = None
 *     for i in grouping[:-1]:             # <<<<<<<<<<<<<<
 *         yield i
 *         l = i
 */
  __pyx_slice__25 = PySlice_New(Py_None, __pyx_int_neg_1, Py_None); if (unlikely(!__pyx_slice__25)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 895; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_slice__25);
  __Pyx_GIVEREF(__pyx_slice__25);

  /* "_cdecimalfp.pyx":948
 *     v, p = dec._value, dec._precision
 *     if v == 0:
 *         return 0, 0             # <<<<<<<<<<<<<<
 *     while p > 0 and v % 10 == 0:
 *         p -= 1
 */
  __pyx_tuple__26 = PyTuple_Pack(2, __pyx_int_0, __pyx_int_0); if (unlikely(!__pyx_tuple__26)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 948; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__26);
  __Pyx_GIVEREF(__pyx_tuple__26);

  /* "_cdecimalfp.pyx":829
 * 
 * 
 * def _getFormatParams(formatSpec):             # <<<<<<<<<<<<<<
 *     m = _parseFormatSpec(formatSpec)
 *     if m is None:
 */
  __pyx_tuple__30 = PyTuple_Pack(16, __pyx_n_s_formatSpec, __pyx_n_s_m, __pyx_n_s_fill, __pyx_n_s_zeropad, __pyx_n_s_fmtFill, __pyx_n_s_fmtAlign, __pyx_n_s_fmtSign, __pyx_n_s_minimumwidth, __pyx_n_s_fmtMinWidth, __pyx_n_s_fmtType, __pyx_n_s_lconv, __pyx_n_s_fmtThousandsSep, __pyx_n_s_fmtGrouping, __pyx_n_s_fmtDecimalPoint, __pyx_n_s_precision, __pyx_n_s_fmtPrecision); if (unlikely(!__pyx_tuple__30)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__30);
  __Pyx_GIVEREF(__pyx_tuple__30);
  __pyx_codeobj__31 = (PyObject*)__Pyx_PyCode_New(1, 0, 16, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__30, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ma_work_decimalfp_work__cd, __pyx_n_s_getFormatParams, 829, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__31)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":870
 * 
 * 
 * def _padDigits(digits, minWidth, fill, sep=None, grouping=None):             # <<<<<<<<<<<<<<
 *     nDigits = len(digits)
 *     if sep and grouping:
 */
  __pyx_tuple__32 = PyTuple_Pack(12, __pyx_n_s_digits, __pyx_n_s_minWidth, __pyx_n_s_fill, __pyx_n_s_sep, __pyx_n_s_grouping, __pyx_n_s_nDigits, __pyx_n_s_slices, __pyx_n_s_i_2, __pyx_n_s_j, __pyx_n_s_limit, __pyx_n_s_l, __pyx_n_s_raw); if (unlikely(!__pyx_tuple__32)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__32);
  __Pyx_GIVEREF(__pyx_tuple__32);
  __pyx_codeobj__33 = (PyObject*)__Pyx_PyCode_New(5, 0, 12, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__32, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ma_work_decimalfp_work__cd, __pyx_n_s_padDigits, 870, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__33)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":893
 * 
 * 
 * def _iterGrouping(grouping):             # <<<<<<<<<<<<<<
 *     l = None
 *     for i in grouping[:-1]:
 */
  __pyx_tuple__34 = PyTuple_Pack(3, __pyx_n_s_grouping, __pyx_n_s_l, __pyx_n_s_i_2); if (unlikely(!__pyx_tuple__34)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_tuple__34);
  __Pyx_GIVEREF(__pyx_tuple__34);
  __pyx_codeobj__35 = (PyObject*)__Pyx_PyCode_New(1, 0, 3, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__34, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_home_ma_work_decimalfp_work__cd, __pyx_n_s_iterGrouping, 893, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__35)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_RefNannyFinishContext();
  return 0;
  __pyx_L1_error:;
  __Pyx_RefNannyFinishContext();
  return -1;
}

static int __Pyx_InitGlobals(void) {
  if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  __pyx_int_0 = PyInt_FromLong(0); if (unlikely(!__pyx_int_0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_1 = PyInt_FromLong(1); if (unlikely(!__pyx_int_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_2 = PyInt_FromLong(2); if (unlikely(!__pyx_int_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_3 = PyInt_FromLong(3); if (unlikely(!__pyx_int_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_5 = PyInt_FromLong(5); if (unlikely(!__pyx_int_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_10 = PyInt_FromLong(10); if (unlikely(!__pyx_int_10)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_int_neg_1 = PyInt_FromLong(-1); if (unlikely(!__pyx_int_neg_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  return 0;
  __pyx_L1_error:;
  return -1;
}

#if PY_MAJOR_VERSION < 3
PyMODINIT_FUNC init_cdecimalfp(void); /*proto*/
PyMODINIT_FUNC init_cdecimalfp(void)
#else
PyMODINIT_FUNC PyInit__cdecimalfp(void); /*proto*/
PyMODINIT_FUNC PyInit__cdecimalfp(void)
#endif
{
  PyObject *__pyx_t_1 = NULL;
  PyObject *__pyx_t_2 = NULL;
  int __pyx_t_3;
  PyObject *__pyx_t_4 = NULL;
  PyObject *__pyx_t_5 = NULL;
  PyObject *__pyx_t_6 = NULL;
  Py_ssize_t __pyx_t_7;
  PyObject *__pyx_t_8 = NULL;
  int __pyx_lineno = 0;
  const char *__pyx_filename = NULL;
  int __pyx_clineno = 0;
  __Pyx_RefNannyDeclarations
  #if CYTHON_REFNANNY
  __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny");
  if (!__Pyx_RefNanny) {
      PyErr_Clear();
      __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny");
      if (!__Pyx_RefNanny)
          Py_FatalError("failed to import 'refnanny' module");
  }
  #endif
  __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit__cdecimalfp(void)", 0);
  if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #ifdef __Pyx_CyFunction_USED
  if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  #ifdef __Pyx_FusedFunction_USED
  if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  #ifdef __Pyx_Generator_USED
  if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  /*--- Library function declarations ---*/
  /*--- Threads initialization code ---*/
  #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS
  #ifdef WITH_THREAD /* Python build with threading support? */
  PyEval_InitThreads();
  #endif
  #endif
  /*--- Module creation code ---*/
  #if PY_MAJOR_VERSION < 3
  __pyx_m = Py_InitModule4("_cdecimalfp", __pyx_methods, __pyx_k_Decimal_fixed_point_arithmetic, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m);
  #else
  __pyx_m = PyModule_Create(&__pyx_moduledef);
  #endif
  if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  Py_INCREF(__pyx_d);
  __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #if CYTHON_COMPILING_IN_PYPY
  Py_INCREF(__pyx_b);
  #endif
  if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  /*--- Initialize various global constants etc. ---*/
  if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT)
  if (__Pyx_init_sys_getdefaultencoding_params() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  #endif
  if (__pyx_module_is_main__cdecimalfp) {
    if (PyObject_SetAttrString(__pyx_m, "__name__", __pyx_n_s_main) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;};
  }
  #if PY_MAJOR_VERSION >= 3
  {
    PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (!PyDict_GetItemString(modules, "_cdecimalfp")) {
      if (unlikely(PyDict_SetItemString(modules, "_cdecimalfp", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    }
  }
  #endif
  /*--- Builtin init code ---*/
  if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  /*--- Constants init code ---*/
  if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  /*--- Global init code ---*/
  __pyx_v_11_cdecimalfp_PYLONG_10 = Py_None; Py_INCREF(Py_None);
  __pyx_v_11_cdecimalfp_LLONG_MAX_LOG10 = Py_None; Py_INCREF(Py_None);
  /*--- Variable export code ---*/
  /*--- Function export code ---*/
  /*--- Type init code ---*/
  if (PyType_Ready(&__pyx_type_11_cdecimalfp_Decimal) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_type_11_cdecimalfp_Decimal.tp_print = 0;
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__repr__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_34__repr__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_34__repr__.doc = __pyx_doc_11_cdecimalfp_7Decimal_34__repr__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_34__repr__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__str__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_36__str__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_36__str__.doc = __pyx_doc_11_cdecimalfp_7Decimal_36__str__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_36__str__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__hash__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_46__hash__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_46__hash__.doc = __pyx_doc_11_cdecimalfp_7Decimal_46__hash__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_46__hash__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__int__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_50__int__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_50__int__.doc = __pyx_doc_11_cdecimalfp_7Decimal_50__int__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_50__int__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__float__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_52__float__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_52__float__.doc = __pyx_doc_11_cdecimalfp_7Decimal_52__float__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_52__float__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__pos__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_54__pos__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_54__pos__.doc = __pyx_doc_11_cdecimalfp_7Decimal_54__pos__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_54__pos__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__neg__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_56__neg__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_56__neg__.doc = __pyx_doc_11_cdecimalfp_7Decimal_56__neg__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_56__neg__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__abs__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_58__abs__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_58__abs__.doc = __pyx_doc_11_cdecimalfp_7Decimal_58__abs__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_58__abs__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__add__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_60__add__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_60__add__.doc = __pyx_doc_11_cdecimalfp_7Decimal_60__add__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_60__add__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__sub__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_62__sub__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_62__sub__.doc = __pyx_doc_11_cdecimalfp_7Decimal_62__sub__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_62__sub__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__mul__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_64__mul__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_64__mul__.doc = __pyx_doc_11_cdecimalfp_7Decimal_64__mul__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_64__mul__;
    }
  }
  #endif
  #if PY_MAJOR_VERSION < 3
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__div__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_66__div__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_66__div__.doc = __pyx_doc_11_cdecimalfp_7Decimal_66__div__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_66__div__;
    }
  }
  #endif
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__truediv__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_68__truediv__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_68__truediv__.doc = __pyx_doc_11_cdecimalfp_7Decimal_68__truediv__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_68__truediv__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__divmod__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_70__divmod__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_70__divmod__.doc = __pyx_doc_11_cdecimalfp_7Decimal_70__divmod__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_70__divmod__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__floordiv__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_72__floordiv__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_72__floordiv__.doc = __pyx_doc_11_cdecimalfp_7Decimal_72__floordiv__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_72__floordiv__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__mod__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_74__mod__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_74__mod__.doc = __pyx_doc_11_cdecimalfp_7Decimal_74__mod__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_74__mod__;
    }
  }
  #endif
  #if CYTHON_COMPILING_IN_CPYTHON
  {
    PyObject *wrapper = PyObject_GetAttrString((PyObject *)&__pyx_type_11_cdecimalfp_Decimal, "__pow__"); if (unlikely(!wrapper)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    if (Py_TYPE(wrapper) == &PyWrapperDescr_Type) {
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_76__pow__ = *((PyWrapperDescrObject *)wrapper)->d_base;
      __pyx_wrapperbase_11_cdecimalfp_7Decimal_76__pow__.doc = __pyx_doc_11_cdecimalfp_7Decimal_76__pow__;
      ((PyWrapperDescrObject *)wrapper)->d_base = &__pyx_wrapperbase_11_cdecimalfp_7Decimal_76__pow__;
    }
  }
  #endif
  if (PyObject_SetAttrString(__pyx_m, "Decimal", (PyObject *)&__pyx_type_11_cdecimalfp_Decimal) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 62; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_ptype_11_cdecimalfp_Decimal = &__pyx_type_11_cdecimalfp_Decimal;
  if (PyType_Ready(&__pyx_type_11_cdecimalfp___pyx_scope_struct___iterGrouping) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __pyx_type_11_cdecimalfp___pyx_scope_struct___iterGrouping.tp_print = 0;
  __pyx_ptype_11_cdecimalfp___pyx_scope_struct___iterGrouping = &__pyx_type_11_cdecimalfp___pyx_scope_struct___iterGrouping;
  /*--- Type import code ---*/
  /*--- Variable import code ---*/
  /*--- Function import code ---*/
  /*--- Execution code ---*/

  /* "_cdecimalfp.pyx":23
 * 
 * from __future__ import absolute_import, division
 * import locale             # <<<<<<<<<<<<<<
 * import math
 * import numbers
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_locale, 0, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_locale, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 23; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":24
 * from __future__ import absolute_import, division
 * import locale
 * import math             # <<<<<<<<<<<<<<
 * import numbers
 * from decimalfp import _get_limit_prec, get_rounding
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_math, 0, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_math, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 24; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":25
 * import locale
 * import math
 * import numbers             # <<<<<<<<<<<<<<
 * from decimalfp import _get_limit_prec, get_rounding
 * from libc.limits cimport LLONG_MAX
 */
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_numbers, 0, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_numbers, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 25; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":26
 * import math
 * import numbers
 * from decimalfp import _get_limit_prec, get_rounding             # <<<<<<<<<<<<<<
 * from libc.limits cimport LLONG_MAX
 * from libc.stdlib cimport atoi
 */
  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_get_limit_prec);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_get_limit_prec);
  __Pyx_GIVEREF(__pyx_n_s_get_limit_prec);
  __Pyx_INCREF(__pyx_n_s_get_rounding);
  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_get_rounding);
  __Pyx_GIVEREF(__pyx_n_s_get_rounding);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_decimalfp, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_get_limit_prec); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_limit_prec, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_get_rounding); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_get_rounding, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 26; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":33
 * from cpython.object cimport PyObject_RichCompare
 * from cpython.version cimport PY_MAJOR_VERSION
 * from decimal import Decimal as _StdLibDecimal             # <<<<<<<<<<<<<<
 * from fractions import gcd, Fraction
 * from functools import reduce
 */
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_Decimal);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_Decimal);
  __Pyx_GIVEREF(__pyx_n_s_Decimal);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_decimal, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_Decimal); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_StdLibDecimal, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 33; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":34
 * from cpython.version cimport PY_MAJOR_VERSION
 * from decimal import Decimal as _StdLibDecimal
 * from fractions import gcd, Fraction             # <<<<<<<<<<<<<<
 * from functools import reduce
 * # rounding modes
 */
  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_gcd);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_gcd);
  __Pyx_GIVEREF(__pyx_n_s_gcd);
  __Pyx_INCREF(__pyx_n_s_Fraction);
  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_Fraction);
  __Pyx_GIVEREF(__pyx_n_s_Fraction);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_fractions, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_gcd); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_gcd, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_Fraction); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_Fraction, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":35
 * from decimal import Decimal as _StdLibDecimal
 * from fractions import gcd, Fraction
 * from functools import reduce             # <<<<<<<<<<<<<<
 * # rounding modes
 * from decimal import ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN, ROUND_HALF_UP,\
 */
  __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_INCREF(__pyx_n_s_reduce);
  PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_reduce);
  __Pyx_GIVEREF(__pyx_n_s_reduce);
  __pyx_t_1 = __Pyx_Import(__pyx_n_s_functools, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_reduce); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_reduce, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 35; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":37
 * from functools import reduce
 * # rounding modes
 * from decimal import ROUND_DOWN, ROUND_UP, ROUND_HALF_DOWN, ROUND_HALF_UP,\             # <<<<<<<<<<<<<<
 *     ROUND_HALF_EVEN, ROUND_CEILING, ROUND_FLOOR, ROUND_05UP
 * 
 */
  __pyx_t_1 = PyList_New(8); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_n_s_ROUND_DOWN);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_ROUND_DOWN);
  __Pyx_GIVEREF(__pyx_n_s_ROUND_DOWN);
  __Pyx_INCREF(__pyx_n_s_ROUND_UP);
  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_ROUND_UP);
  __Pyx_GIVEREF(__pyx_n_s_ROUND_UP);
  __Pyx_INCREF(__pyx_n_s_ROUND_HALF_DOWN);
  PyList_SET_ITEM(__pyx_t_1, 2, __pyx_n_s_ROUND_HALF_DOWN);
  __Pyx_GIVEREF(__pyx_n_s_ROUND_HALF_DOWN);
  __Pyx_INCREF(__pyx_n_s_ROUND_HALF_UP);
  PyList_SET_ITEM(__pyx_t_1, 3, __pyx_n_s_ROUND_HALF_UP);
  __Pyx_GIVEREF(__pyx_n_s_ROUND_HALF_UP);
  __Pyx_INCREF(__pyx_n_s_ROUND_HALF_EVEN);
  PyList_SET_ITEM(__pyx_t_1, 4, __pyx_n_s_ROUND_HALF_EVEN);
  __Pyx_GIVEREF(__pyx_n_s_ROUND_HALF_EVEN);
  __Pyx_INCREF(__pyx_n_s_ROUND_CEILING);
  PyList_SET_ITEM(__pyx_t_1, 5, __pyx_n_s_ROUND_CEILING);
  __Pyx_GIVEREF(__pyx_n_s_ROUND_CEILING);
  __Pyx_INCREF(__pyx_n_s_ROUND_FLOOR);
  PyList_SET_ITEM(__pyx_t_1, 6, __pyx_n_s_ROUND_FLOOR);
  __Pyx_GIVEREF(__pyx_n_s_ROUND_FLOOR);
  __Pyx_INCREF(__pyx_n_s_ROUND_05UP);
  PyList_SET_ITEM(__pyx_t_1, 7, __pyx_n_s_ROUND_05UP);
  __Pyx_GIVEREF(__pyx_n_s_ROUND_05UP);
  __pyx_t_2 = __Pyx_Import(__pyx_n_s_decimal, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ROUND_DOWN); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ROUND_DOWN, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ROUND_UP); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ROUND_UP, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ROUND_HALF_DOWN); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ROUND_HALF_DOWN, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ROUND_HALF_UP); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ROUND_HALF_UP, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ROUND_HALF_EVEN); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ROUND_HALF_EVEN, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ROUND_CEILING); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ROUND_CEILING, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ROUND_FLOOR); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ROUND_FLOOR, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_ROUND_05UP); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 37; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_ROUND_05UP, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 38; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":42
 * 
 * # Python 2 / Python 3
 * if PY_MAJOR_VERSION < 3:             # <<<<<<<<<<<<<<
 *     # rounding mode of builtin round function
 *     DFLT_ROUNDING = ROUND_HALF_UP
 */
  __pyx_t_3 = ((PY_MAJOR_VERSION < 3) != 0);
  if (__pyx_t_3) {

    /* "_cdecimalfp.pyx":44
 * if PY_MAJOR_VERSION < 3:
 *     # rounding mode of builtin round function
 *     DFLT_ROUNDING = ROUND_HALF_UP             # <<<<<<<<<<<<<<
 * else:
 *     # In 3.0 round changed from half-up to half-even !
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_ROUND_HALF_UP); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    if (PyDict_SetItem(__pyx_d, __pyx_n_s_DFLT_ROUNDING, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 44; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
    goto __pyx_L2;
  }
  /*else*/ {

    /* "_cdecimalfp.pyx":47
 * else:
 *     # In 3.0 round changed from half-up to half-even !
 *     DFLT_ROUNDING = ROUND_HALF_EVEN             # <<<<<<<<<<<<<<
 * 
 * # Compatible testing for strings
 */
    __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_ROUND_HALF_EVEN); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_2);
    if (PyDict_SetItem(__pyx_d, __pyx_n_s_DFLT_ROUNDING, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 47; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  }
  __pyx_L2:;

  /* "_cdecimalfp.pyx":50
 * 
 * # Compatible testing for strings
 * py_str = type(u'')             # <<<<<<<<<<<<<<
 * py_bytes = type(b'')
 * str_types = (py_bytes, py_str)
 */
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_py_str, ((PyObject *)Py_TYPE(__pyx_kp_u__7))) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 50; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":51
 * # Compatible testing for strings
 * py_str = type(u'')
 * py_bytes = type(b'')             # <<<<<<<<<<<<<<
 * str_types = (py_bytes, py_str)
 * 
 */
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_py_bytes, ((PyObject *)Py_TYPE(__pyx_kp_b__7))) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 51; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":52
 * py_str = type(u'')
 * py_bytes = type(b'')
 * str_types = (py_bytes, py_str)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_py_bytes); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_py_str); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1);
  __Pyx_GIVEREF(__pyx_t_1);
  __pyx_t_2 = 0;
  __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_str_types, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

  /* "_cdecimalfp.pyx":56
 * 
 * # constants used for power to 10
 * cdef PYLONG_10 = PyLong_FromLong(10)             # <<<<<<<<<<<<<<
 * cdef LLONG_MAX_LOG10 = int(math.log10(PyLong_FromLongLong(LLONG_MAX)))
 * 
 */
  __pyx_t_4 = PyLong_FromLong(10); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 56; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_XGOTREF(__pyx_v_11_cdecimalfp_PYLONG_10);
  __Pyx_DECREF_SET(__pyx_v_11_cdecimalfp_PYLONG_10, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;

  /* "_cdecimalfp.pyx":57
 * # constants used for power to 10
 * cdef PYLONG_10 = PyLong_FromLong(10)
 * cdef LLONG_MAX_LOG10 = int(math.log10(PyLong_FromLongLong(LLONG_MAX)))             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_1 = __Pyx_GetModuleGlobalName(__pyx_n_s_math); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_log10); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = PyLong_FromLongLong(LLONG_MAX); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __pyx_t_5 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_5) {
    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
    __Pyx_GOTREF(__pyx_t_4);
  } else {
    __pyx_t_6 = PyTuple_New(1+1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_6);
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
    PyTuple_SET_ITEM(__pyx_t_6, 0+1, __pyx_t_1);
    __Pyx_GIVEREF(__pyx_t_1);
    __pyx_t_1 = 0;
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_6, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = PyNumber_Int(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 57; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __Pyx_XGOTREF(__pyx_v_11_cdecimalfp_LLONG_MAX_LOG10);
  __Pyx_DECREF_SET(__pyx_v_11_cdecimalfp_LLONG_MAX_LOG10, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_2 = 0;

  /* "_cdecimalfp.pyx":217
 *     # to be compatible to fractions.Fraction
 *     @classmethod
 *     def from_float(cls, f):             # <<<<<<<<<<<<<<
 *         """Convert a finite float (or int) to a :class:`Decimal`.
 * 
 */
  __pyx_t_2 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal, __pyx_n_s_from_float); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);

  /* "_cdecimalfp.pyx":216
 * 
 *     # to be compatible to fractions.Fraction
 *     @classmethod             # <<<<<<<<<<<<<<
 *     def from_float(cls, f):
 *         """Convert a finite float (or int) to a :class:`Decimal`.
 */
  __pyx_t_4 = __Pyx_Method_ClassMethod(__pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 216; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal->tp_dict, __pyx_n_s_from_float, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 217; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  PyType_Modified(__pyx_ptype_11_cdecimalfp_Decimal);

  /* "_cdecimalfp.pyx":239
 *     # to be compatible to fractions.Fraction
 *     @classmethod
 *     def from_decimal(cls, d):             # <<<<<<<<<<<<<<
 *         """Convert a finite decimal number to a :class:`Decimal`.
 * 
 */
  __pyx_t_4 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal, __pyx_n_s_from_decimal); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);

  /* "_cdecimalfp.pyx":238
 * 
 *     # to be compatible to fractions.Fraction
 *     @classmethod             # <<<<<<<<<<<<<<
 *     def from_decimal(cls, d):
 *         """Convert a finite decimal number to a :class:`Decimal`.
 */
  __pyx_t_2 = __Pyx_Method_ClassMethod(__pyx_t_4); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 238; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal->tp_dict, __pyx_n_s_from_decimal, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 239; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  PyType_Modified(__pyx_ptype_11_cdecimalfp_Decimal);

  /* "_cdecimalfp.pyx":261
 * 
 *     @classmethod
 *     def from_real(cls, r, exact=True):             # <<<<<<<<<<<<<<
 *         """Convert a Real number to a :class:`Decimal`.
 * 
 */
  __pyx_t_2 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal, __pyx_n_s_from_real); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);

  /* "_cdecimalfp.pyx":260
 *         return cls(d)
 * 
 *     @classmethod             # <<<<<<<<<<<<<<
 *     def from_real(cls, r, exact=True):
 *         """Convert a Real number to a :class:`Decimal`.
 */
  __pyx_t_4 = __Pyx_Method_ClassMethod(__pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 260; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal->tp_dict, __pyx_n_s_from_real, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 261; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  PyType_Modified(__pyx_ptype_11_cdecimalfp_Decimal);

  /* "_cdecimalfp.pyx":292
 * 
 *     @property
 *     def precision(self):             # <<<<<<<<<<<<<<
 *         """Return precision of `self`."""
 *         return self._precision
 */
  __pyx_t_4 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal, __pyx_n_s_precision); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);

  /* "_cdecimalfp.pyx":291
 *                 return cls(r, _get_limit_prec())
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def precision(self):
 *         """Return precision of `self`."""
 */
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 291; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal->tp_dict, __pyx_n_s_precision, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 292; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  PyType_Modified(__pyx_ptype_11_cdecimalfp_Decimal);

  /* "_cdecimalfp.pyx":297
 * 
 *     @property
 *     def magnitude(self):             # <<<<<<<<<<<<<<
 *         """Return magnitude of `self` in terms of power to 10, i.e. the
 *         smallest integer exp so that 10 ** exp >= self."""
 */
  __pyx_t_4 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal, __pyx_n_s_magnitude); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);

  /* "_cdecimalfp.pyx":296
 *         return self._precision
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def magnitude(self):
 *         """Return magnitude of `self` in terms of power to 10, i.e. the
 */
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 296; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal->tp_dict, __pyx_n_s_magnitude, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 297; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  PyType_Modified(__pyx_ptype_11_cdecimalfp_Decimal);

  /* "_cdecimalfp.pyx":303
 * 
 *     @property
 *     def numerator(self):             # <<<<<<<<<<<<<<
 *         """Return the numerator from the pair of integers with the smallest
 *         positive denominator, whose ratio is equal to `self`."""
 */
  __pyx_t_4 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal, __pyx_n_s_numerator); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);

  /* "_cdecimalfp.pyx":302
 *         return len(str(self._value)) - self._precision
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def numerator(self):
 *         """Return the numerator from the pair of integers with the smallest
 */
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 302; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal->tp_dict, __pyx_n_s_numerator, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 303; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  PyType_Modified(__pyx_ptype_11_cdecimalfp_Decimal);

  /* "_cdecimalfp.pyx":310
 * 
 *     @property
 *     def denominator(self):             # <<<<<<<<<<<<<<
 *         """Return the smallest positive denominator from the pairs of
 *         integers, whose ratio is equal to `self`."""
 */
  __pyx_t_4 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal, __pyx_n_s_denominator); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);

  /* "_cdecimalfp.pyx":309
 *         return n
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def denominator(self):
 *         """Return the smallest positive denominator from the pairs of
 */
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal->tp_dict, __pyx_n_s_denominator, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 310; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  PyType_Modified(__pyx_ptype_11_cdecimalfp_Decimal);

  /* "_cdecimalfp.pyx":317
 * 
 *     @property
 *     def real(self):             # <<<<<<<<<<<<<<
 *         """The real of `self`.
 * 
 */
  __pyx_t_4 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal, __pyx_n_s_real); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);

  /* "_cdecimalfp.pyx":316
 *         return d
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def real(self):
 *         """The real of `self`.
 */
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 316; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal->tp_dict, __pyx_n_s_real, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 317; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  PyType_Modified(__pyx_ptype_11_cdecimalfp_Decimal);

  /* "_cdecimalfp.pyx":324
 * 
 *     @property
 *     def imag(self):             # <<<<<<<<<<<<<<
 *         """The imaginary part of `self`.
 * 
 */
  __pyx_t_4 = __Pyx_GetNameInClass((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal, __pyx_n_s_imag); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);

  /* "_cdecimalfp.pyx":323
 *         return self
 * 
 *     @property             # <<<<<<<<<<<<<<
 *     def imag(self):
 *         """The imaginary part of `self`.
 */
  __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_property, __pyx_t_2, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 323; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem((PyObject *)__pyx_ptype_11_cdecimalfp_Decimal->tp_dict, __pyx_n_s_imag, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  PyType_Modified(__pyx_ptype_11_cdecimalfp_Decimal);

  /* "_cdecimalfp.pyx":676
 * 
 * # register Decimal as Rational
 * numbers.Rational.register(Decimal)             # <<<<<<<<<<<<<<
 * 
 * 
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_numbers); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_Rational); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_register); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (!__pyx_t_6) {
    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_2, ((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal))); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
  } else {
    __pyx_t_1 = PyTuple_New(1+1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_1);
    PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
    __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)));
    PyTuple_SET_ITEM(__pyx_t_1, 0+1, ((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)));
    __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_11_cdecimalfp_Decimal)));
    __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_2, __pyx_t_1, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 676; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_GOTREF(__pyx_t_4);
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  }
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

  /* "_cdecimalfp.pyx":689
 * 
 * # parse string
 * import re             # <<<<<<<<<<<<<<
 * _pattern = r"""
 *             \s*
 */
  __pyx_t_4 = __Pyx_Import(__pyx_n_s_re, 0, 0); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 689; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_re, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 689; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

  /* "_cdecimalfp.pyx":700
 *             ([eE](?P<exp>[+|-]?\d+))?
 *             \s*$
 *             """.encode()             # <<<<<<<<<<<<<<
 * _parseString = re.compile(_pattern, re.VERBOSE).match
 * 
 */
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_kp_s_s_P_sign_P_int_d_P_frac_d_P_onl, __pyx_n_s_encode); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = NULL;
  if (CYTHON_COMPILING_IN_CPYTHON && likely(PyMethod_Check(__pyx_t_2))) {
    __pyx_t_1 = PyMethod_GET_SELF(__pyx_t_2);
    if (likely(__pyx_t_1)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2);
      __Pyx_INCREF(__pyx_t_1);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_2, function);
    }
  }
  if (__pyx_t_1) {
    __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
    __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  } else {
    __pyx_t_4 = __Pyx_PyObject_CallNoArg(__pyx_t_2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 700; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  }
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pattern, __pyx_t_4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 690; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;

  /* "_cdecimalfp.pyx":701
 *             \s*$
 *             """.encode()
 * _parseString = re.compile(_pattern, re.VERBOSE).match             # <<<<<<<<<<<<<<
 * 
 * cdef void _dec_from_str(Decimal dec, bytes s, int prec) except *:
 */
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_2, __pyx_n_s_compile); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0;
  __pyx_t_2 = __Pyx_GetModuleGlobalName(__pyx_n_s_pattern); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __pyx_t_6 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_VERBOSE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __pyx_t_6 = NULL;
  __pyx_t_7 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_1))) {
    __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_1);
    if (likely(__pyx_t_6)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_1);
      __Pyx_INCREF(__pyx_t_6);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_1, function);
      __pyx_t_7 = 1;
    }
  }
  __pyx_t_8 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  if (__pyx_t_6) {
    PyTuple_SET_ITEM(__pyx_t_8, 0, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); __pyx_t_6 = NULL;
  }
  PyTuple_SET_ITEM(__pyx_t_8, 0+__pyx_t_7, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  PyTuple_SET_ITEM(__pyx_t_8, 1+__pyx_t_7, __pyx_t_5);
  __Pyx_GIVEREF(__pyx_t_5);
  __pyx_t_2 = 0;
  __pyx_t_5 = 0;
  __pyx_t_4 = __Pyx_PyObject_Call(__pyx_t_1, __pyx_t_8, NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_match); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_parseString, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 701; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;

  /* "_cdecimalfp.pyx":800
 * # [[fill]align][sign][0][minimumwidth][,][.precision][type]
 * 
 * _pattern = r"""             # <<<<<<<<<<<<<<
 *             \A
 *             (?:
 */
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_pattern, __pyx_kp_s_A_P_fill_P_align_P_sign_P_zerop) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 800; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":814
 *             \Z
 *             """
 * _parseFormatSpec = re.compile(_pattern, re.VERBOSE).match             # <<<<<<<<<<<<<<
 * del re, _pattern
 * 
 */
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_4, __pyx_n_s_compile); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0;
  __pyx_t_4 = __Pyx_GetModuleGlobalName(__pyx_n_s_pattern); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_4);
  __pyx_t_5 = __Pyx_GetModuleGlobalName(__pyx_n_s_re); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_5);
  __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_5, __pyx_n_s_VERBOSE); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_2);
  __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0;
  __pyx_t_5 = NULL;
  __pyx_t_7 = 0;
  if (CYTHON_COMPILING_IN_CPYTHON && unlikely(PyMethod_Check(__pyx_t_8))) {
    __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_8);
    if (likely(__pyx_t_5)) {
      PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8);
      __Pyx_INCREF(__pyx_t_5);
      __Pyx_INCREF(function);
      __Pyx_DECREF_SET(__pyx_t_8, function);
      __pyx_t_7 = 1;
    }
  }
  __pyx_t_6 = PyTuple_New(2+__pyx_t_7); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_6);
  if (__pyx_t_5) {
    PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_5); __Pyx_GIVEREF(__pyx_t_5); __pyx_t_5 = NULL;
  }
  PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_7, __pyx_t_4);
  __Pyx_GIVEREF(__pyx_t_4);
  PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_7, __pyx_t_2);
  __Pyx_GIVEREF(__pyx_t_2);
  __pyx_t_4 = 0;
  __pyx_t_2 = 0;
  __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_8, __pyx_t_6, NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0;
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;
  __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_match); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_parseFormatSpec, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

  /* "_cdecimalfp.pyx":815
 *             """
 * _parseFormatSpec = re.compile(_pattern, re.VERBOSE).match
 * del re, _pattern             # <<<<<<<<<<<<<<
 * 
 * _dfltFormatParams = {'fill': ' ',
 */
  if (__Pyx_PyObject_DelAttrStr(__pyx_m, __pyx_n_s_re) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (__Pyx_PyObject_DelAttrStr(__pyx_m, __pyx_n_s_pattern) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":817
 * del re, _pattern
 * 
 * _dfltFormatParams = {'fill': ' ',             # <<<<<<<<<<<<<<
 *                      'align': '<',
 *                      'sign': '-',
 */
  __pyx_t_8 = PyDict_New(); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_fill, __pyx_kp_s__27) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_align, __pyx_kp_s__28) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_sign, __pyx_kp_s__4) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_minimumwidth, __pyx_int_0) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_thousands_sep, __pyx_kp_s__7) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":823
 *                      'minimumwidth': 0,
 *                      'thousands_sep': '',
 *                      'grouping': [3, 0],             # <<<<<<<<<<<<<<
 *                      'decimal_point': '.',
 *                      'precision': None,
 */
  __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_1);
  __Pyx_INCREF(__pyx_int_3);
  PyList_SET_ITEM(__pyx_t_1, 0, __pyx_int_3);
  __Pyx_GIVEREF(__pyx_int_3);
  __Pyx_INCREF(__pyx_int_0);
  PyList_SET_ITEM(__pyx_t_1, 1, __pyx_int_0);
  __Pyx_GIVEREF(__pyx_int_0);
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_grouping, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0;
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_decimal_point, __pyx_kp_s__29) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}

  /* "_cdecimalfp.pyx":825
 *                      'grouping': [3, 0],
 *                      'decimal_point': '.',
 *                      'precision': None,             # <<<<<<<<<<<<<<
 *                      'type': 'f'}
 * 
 */
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_precision, Py_None) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (PyDict_SetItem(__pyx_t_8, __pyx_n_s_type, __pyx_n_s_f) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_dfltFormatParams, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

  /* "_cdecimalfp.pyx":829
 * 
 * 
 * def _getFormatParams(formatSpec):             # <<<<<<<<<<<<<<
 *     m = _parseFormatSpec(formatSpec)
 *     if m is None:
 */
  __pyx_t_8 = PyCFunction_NewEx(&__pyx_mdef_11_cdecimalfp_1_getFormatParams, NULL, __pyx_n_s_cdecimalfp); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_getFormatParams, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

  /* "_cdecimalfp.pyx":870
 * 
 * 
 * def _padDigits(digits, minWidth, fill, sep=None, grouping=None):             # <<<<<<<<<<<<<<
 *     nDigits = len(digits)
 *     if sep and grouping:
 */
  __pyx_t_8 = PyCFunction_NewEx(&__pyx_mdef_11_cdecimalfp_3_padDigits, NULL, __pyx_n_s_cdecimalfp); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_padDigits, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 870; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

  /* "_cdecimalfp.pyx":893
 * 
 * 
 * def _iterGrouping(grouping):             # <<<<<<<<<<<<<<
 *     l = None
 *     for i in grouping[:-1]:
 */
  __pyx_t_8 = PyCFunction_NewEx(&__pyx_mdef_11_cdecimalfp_5_iterGrouping, NULL, __pyx_n_s_cdecimalfp); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_iterGrouping, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 893; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

  /* "_cdecimalfp.pyx":1
 * # -*- coding: utf-8 -*-             # <<<<<<<<<<<<<<
 * ##----------------------------------------------------------------------------
 * ## Name:        _cdecimalfp
 */
  __pyx_t_8 = PyDict_New(); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_GOTREF(__pyx_t_8);
  if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}
  __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0;

  /*--- Wrapped vars code ---*/

  goto __pyx_L0;
  __pyx_L1_error:;
  __Pyx_XDECREF(__pyx_t_1);
  __Pyx_XDECREF(__pyx_t_2);
  __Pyx_XDECREF(__pyx_t_4);
  __Pyx_XDECREF(__pyx_t_5);
  __Pyx_XDECREF(__pyx_t_6);
  __Pyx_XDECREF(__pyx_t_8);
  if (__pyx_m) {
    if (__pyx_d) {
      __Pyx_AddTraceback("init _cdecimalfp", __pyx_clineno, __pyx_lineno, __pyx_filename);
    }
    Py_DECREF(__pyx_m); __pyx_m = 0;
  } else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_ImportError, "init _cdecimalfp");
  }
  __pyx_L0:;
  __Pyx_RefNannyFinishContext();
  #if PY_MAJOR_VERSION < 3
  return;
  #else
  return __pyx_m;
  #endif
}

/* Runtime support code */
#if CYTHON_REFNANNY
static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) {
    PyObject *m = NULL, *p = NULL;
    void *r = NULL;
    m = PyImport_ImportModule((char *)modname);
    if (!m) goto end;
    p = PyObject_GetAttrString(m, (char *)"RefNannyAPI");
    if (!p) goto end;
    r = PyLong_AsVoidPtr(p);
end:
    Py_XDECREF(p);
    Py_XDECREF(m);
    return (__Pyx_RefNannyAPIStruct *)r;
}
#endif

static PyObject *__Pyx_GetBuiltinName(PyObject *name) {
    PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name);
    if (unlikely(!result)) {
        PyErr_Format(PyExc_NameError,
#if PY_MAJOR_VERSION >= 3
            "name '%U' is not defined", name);
#else
            "name '%.200s' is not defined", PyString_AS_STRING(name));
#endif
    }
    return result;
}

static void __Pyx_RaiseDoubleKeywordsError(
    const char* func_name,
    PyObject* kw_name)
{
    PyErr_Format(PyExc_TypeError,
        #if PY_MAJOR_VERSION >= 3
        "%s() got multiple values for keyword argument '%U'", func_name, kw_name);
        #else
        "%s() got multiple values for keyword argument '%s'", func_name,
        PyString_AsString(kw_name));
        #endif
}

static int __Pyx_ParseOptionalKeywords(
    PyObject *kwds,
    PyObject **argnames[],
    PyObject *kwds2,
    PyObject *values[],
    Py_ssize_t num_pos_args,
    const char* function_name)
{
    PyObject *key = 0, *value = 0;
    Py_ssize_t pos = 0;
    PyObject*** name;
    PyObject*** first_kw_arg = argnames + num_pos_args;
    while (PyDict_Next(kwds, &pos, &key, &value)) {
        name = first_kw_arg;
        while (*name && (**name != key)) name++;
        if (*name) {
            values[name-argnames] = value;
            continue;
        }
        name = first_kw_arg;
        #if PY_MAJOR_VERSION < 3
        if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) {
            while (*name) {
                if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key))
                        && _PyString_Eq(**name, key)) {
                    values[name-argnames] = value;
                    break;
                }
                name++;
            }
            if (*name) continue;
            else {
                PyObject*** argname = argnames;
                while (argname != first_kw_arg) {
                    if ((**argname == key) || (
                            (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key))
                             && _PyString_Eq(**argname, key))) {
                        goto arg_passed_twice;
                    }
                    argname++;
                }
            }
        } else
        #endif
        if (likely(PyUnicode_Check(key))) {
            while (*name) {
                int cmp = (**name == key) ? 0 :
                #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
                    (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 :
                #endif
                    PyUnicode_Compare(**name, key);
                if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
                if (cmp == 0) {
                    values[name-argnames] = value;
                    break;
                }
                name++;
            }
            if (*name) continue;
            else {
                PyObject*** argname = argnames;
                while (argname != first_kw_arg) {
                    int cmp = (**argname == key) ? 0 :
                    #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3
                        (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 :
                    #endif
                        PyUnicode_Compare(**argname, key);
                    if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad;
                    if (cmp == 0) goto arg_passed_twice;
                    argname++;
                }
            }
        } else
            goto invalid_keyword_type;
        if (kwds2) {
            if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad;
        } else {
            goto invalid_keyword;
        }
    }
    return 0;
arg_passed_twice:
    __Pyx_RaiseDoubleKeywordsError(function_name, key);
    goto bad;
invalid_keyword_type:
    PyErr_Format(PyExc_TypeError,
        "%.200s() keywords must be strings", function_name);
    goto bad;
invalid_keyword:
    PyErr_Format(PyExc_TypeError,
    #if PY_MAJOR_VERSION < 3
        "%.200s() got an unexpected keyword argument '%.200s'",
        function_name, PyString_AsString(key));
    #else
        "%s() got an unexpected keyword argument '%U'",
        function_name, key);
    #endif
bad:
    return -1;
}

static void __Pyx_RaiseArgtupleInvalid(
    const char* func_name,
    int exact,
    Py_ssize_t num_min,
    Py_ssize_t num_max,
    Py_ssize_t num_found)
{
    Py_ssize_t num_expected;
    const char *more_or_less;
    if (num_found < num_min) {
        num_expected = num_min;
        more_or_less = "at least";
    } else {
        num_expected = num_max;
        more_or_less = "at most";
    }
    if (exact) {
        more_or_less = "exactly";
    }
    PyErr_Format(PyExc_TypeError,
                 "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)",
                 func_name, more_or_less, num_expected,
                 (num_expected == 1) ? "" : "s", num_found);
}

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) {
    PyObject *result;
    ternaryfunc call = func->ob_type->tp_call;
    if (unlikely(!call))
        return PyObject_Call(func, arg, kw);
    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
        return NULL;
    result = (*call)(func, arg, kw);
    Py_LeaveRecursiveCall();
    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
        PyErr_SetString(
            PyExc_SystemError,
            "NULL result without error in PyObject_Call");
    }
    return result;
}
#endif

static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    PyThreadState *tstate = PyThreadState_GET();
    tmp_type = tstate->curexc_type;
    tmp_value = tstate->curexc_value;
    tmp_tb = tstate->curexc_traceback;
    tstate->curexc_type = type;
    tstate->curexc_value = value;
    tstate->curexc_traceback = tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
#else
    PyErr_Restore(type, value, tb);
#endif
}
static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyThreadState *tstate = PyThreadState_GET();
    *type = tstate->curexc_type;
    *value = tstate->curexc_value;
    *tb = tstate->curexc_traceback;
    tstate->curexc_type = 0;
    tstate->curexc_value = 0;
    tstate->curexc_traceback = 0;
#else
    PyErr_Fetch(type, value, tb);
#endif
}

#if PY_MAJOR_VERSION < 3
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb,
                        CYTHON_UNUSED PyObject *cause) {
    Py_XINCREF(type);
    if (!value || value == Py_None)
        value = NULL;
    else
        Py_INCREF(value);
    if (!tb || tb == Py_None)
        tb = NULL;
    else {
        Py_INCREF(tb);
        if (!PyTraceBack_Check(tb)) {
            PyErr_SetString(PyExc_TypeError,
                "raise: arg 3 must be a traceback or None");
            goto raise_error;
        }
    }
    if (PyType_Check(type)) {
#if CYTHON_COMPILING_IN_PYPY
        if (!value) {
            Py_INCREF(Py_None);
            value = Py_None;
        }
#endif
        PyErr_NormalizeException(&type, &value, &tb);
    } else {
        if (value) {
            PyErr_SetString(PyExc_TypeError,
                "instance exception may not have a separate value");
            goto raise_error;
        }
        value = type;
        type = (PyObject*) Py_TYPE(type);
        Py_INCREF(type);
        if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) {
            PyErr_SetString(PyExc_TypeError,
                "raise: exception class must be a subclass of BaseException");
            goto raise_error;
        }
    }
    __Pyx_ErrRestore(type, value, tb);
    return;
raise_error:
    Py_XDECREF(value);
    Py_XDECREF(type);
    Py_XDECREF(tb);
    return;
}
#else
static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) {
    PyObject* owned_instance = NULL;
    if (tb == Py_None) {
        tb = 0;
    } else if (tb && !PyTraceBack_Check(tb)) {
        PyErr_SetString(PyExc_TypeError,
            "raise: arg 3 must be a traceback or None");
        goto bad;
    }
    if (value == Py_None)
        value = 0;
    if (PyExceptionInstance_Check(type)) {
        if (value) {
            PyErr_SetString(PyExc_TypeError,
                "instance exception may not have a separate value");
            goto bad;
        }
        value = type;
        type = (PyObject*) Py_TYPE(value);
    } else if (PyExceptionClass_Check(type)) {
        PyObject *instance_class = NULL;
        if (value && PyExceptionInstance_Check(value)) {
            instance_class = (PyObject*) Py_TYPE(value);
            if (instance_class != type) {
                if (PyObject_IsSubclass(instance_class, type)) {
                    type = instance_class;
                } else {
                    instance_class = NULL;
                }
            }
        }
        if (!instance_class) {
            PyObject *args;
            if (!value)
                args = PyTuple_New(0);
            else if (PyTuple_Check(value)) {
                Py_INCREF(value);
                args = value;
            } else
                args = PyTuple_Pack(1, value);
            if (!args)
                goto bad;
            owned_instance = PyObject_Call(type, args, NULL);
            Py_DECREF(args);
            if (!owned_instance)
                goto bad;
            value = owned_instance;
            if (!PyExceptionInstance_Check(value)) {
                PyErr_Format(PyExc_TypeError,
                             "calling %R should have returned an instance of "
                             "BaseException, not %R",
                             type, Py_TYPE(value));
                goto bad;
            }
        }
    } else {
        PyErr_SetString(PyExc_TypeError,
            "raise: exception class must be a subclass of BaseException");
        goto bad;
    }
#if PY_VERSION_HEX >= 0x03030000
    if (cause) {
#else
    if (cause && cause != Py_None) {
#endif
        PyObject *fixed_cause;
        if (cause == Py_None) {
            fixed_cause = NULL;
        } else if (PyExceptionClass_Check(cause)) {
            fixed_cause = PyObject_CallObject(cause, NULL);
            if (fixed_cause == NULL)
                goto bad;
        } else if (PyExceptionInstance_Check(cause)) {
            fixed_cause = cause;
            Py_INCREF(fixed_cause);
        } else {
            PyErr_SetString(PyExc_TypeError,
                            "exception causes must derive from "
                            "BaseException");
            goto bad;
        }
        PyException_SetCause(value, fixed_cause);
    }
    PyErr_SetObject(type, value);
    if (tb) {
#if CYTHON_COMPILING_IN_PYPY
        PyObject *tmp_type, *tmp_value, *tmp_tb;
        PyErr_Fetch(tmp_type, tmp_value, tmp_tb);
        Py_INCREF(tb);
        PyErr_Restore(tmp_type, tmp_value, tb);
        Py_XDECREF(tmp_tb);
#else
        PyThreadState *tstate = PyThreadState_GET();
        PyObject* tmp_tb = tstate->curexc_traceback;
        if (tb != tmp_tb) {
            Py_INCREF(tb);
            tstate->curexc_traceback = tb;
            Py_XDECREF(tmp_tb);
        }
#endif
    }
bad:
    Py_XDECREF(owned_instance);
    return;
}
#endif

static CYTHON_INLINE PyObject *__Pyx_GetModuleGlobalName(PyObject *name) {
    PyObject *result;
#if CYTHON_COMPILING_IN_CPYTHON
    result = PyDict_GetItem(__pyx_d, name);
    if (likely(result)) {
        Py_INCREF(result);
    } else {
#else
    result = PyObject_GetItem(__pyx_d, name);
    if (!result) {
        PyErr_Clear();
#endif
        result = __Pyx_GetBuiltinName(name);
    }
    return result;
}

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) {
    PyObject *self, *result;
    PyCFunction cfunc;
    cfunc = PyCFunction_GET_FUNCTION(func);
    self = PyCFunction_GET_SELF(func);
    if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object")))
        return NULL;
    result = cfunc(self, arg);
    Py_LeaveRecursiveCall();
    if (unlikely(!result) && unlikely(!PyErr_Occurred())) {
        PyErr_SetString(
            PyExc_SystemError,
            "NULL result without error in PyObject_Call");
    }
    return result;
}
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) {
    PyObject *result;
    PyObject *args = PyTuple_New(1);
    if (unlikely(!args)) return NULL;
    Py_INCREF(arg);
    PyTuple_SET_ITEM(args, 0, arg);
    result = __Pyx_PyObject_Call(func, args, NULL);
    Py_DECREF(args);
    return result;
}
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
#ifdef __Pyx_CyFunction_USED
    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
#else
    if (likely(PyCFunction_Check(func))) {
#endif
        if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) {
            return __Pyx_PyObject_CallMethO(func, arg);
        }
    }
    return __Pyx__PyObject_CallOneArg(func, arg);
}
#else
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) {
    PyObject* args = PyTuple_Pack(1, arg);
    return (likely(args)) ? __Pyx_PyObject_Call(func, args, NULL) : NULL;
}
#endif

#if CYTHON_COMPILING_IN_CPYTHON
static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) {
#ifdef __Pyx_CyFunction_USED
    if (likely(PyCFunction_Check(func) || PyObject_TypeCheck(func, __pyx_CyFunctionType))) {
#else
    if (likely(PyCFunction_Check(func))) {
#endif
        if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) {
            return __Pyx_PyObject_CallMethO(func, NULL);
        }
    }
    return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL);
}
#endif

static CYTHON_INLINE void __Pyx_ExceptionSave(PyObject **type, PyObject **value, PyObject **tb) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyThreadState *tstate = PyThreadState_GET();
    *type = tstate->exc_type;
    *value = tstate->exc_value;
    *tb = tstate->exc_traceback;
    Py_XINCREF(*type);
    Py_XINCREF(*value);
    Py_XINCREF(*tb);
#else
    PyErr_GetExcInfo(type, value, tb);
#endif
}
static void __Pyx_ExceptionReset(PyObject *type, PyObject *value, PyObject *tb) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    PyThreadState *tstate = PyThreadState_GET();
    tmp_type = tstate->exc_type;
    tmp_value = tstate->exc_value;
    tmp_tb = tstate->exc_traceback;
    tstate->exc_type = type;
    tstate->exc_value = value;
    tstate->exc_traceback = tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
#else
    PyErr_SetExcInfo(type, value, tb);
#endif
}

static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) {
    PyObject *local_type, *local_value, *local_tb;
#if CYTHON_COMPILING_IN_CPYTHON
    PyObject *tmp_type, *tmp_value, *tmp_tb;
    PyThreadState *tstate = PyThreadState_GET();
    local_type = tstate->curexc_type;
    local_value = tstate->curexc_value;
    local_tb = tstate->curexc_traceback;
    tstate->curexc_type = 0;
    tstate->curexc_value = 0;
    tstate->curexc_traceback = 0;
#else
    PyErr_Fetch(&local_type, &local_value, &local_tb);
#endif
    PyErr_NormalizeException(&local_type, &local_value, &local_tb);
#if CYTHON_COMPILING_IN_CPYTHON
    if (unlikely(tstate->curexc_type))
#else
    if (unlikely(PyErr_Occurred()))
#endif
        goto bad;
    #if PY_MAJOR_VERSION >= 3
    if (local_tb) {
        if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0))
            goto bad;
    }
    #endif
    Py_XINCREF(local_tb);
    Py_XINCREF(local_type);
    Py_XINCREF(local_value);
    *type = local_type;
    *value = local_value;
    *tb = local_tb;
#if CYTHON_COMPILING_IN_CPYTHON
    tmp_type = tstate->exc_type;
    tmp_value = tstate->exc_value;
    tmp_tb = tstate->exc_traceback;
    tstate->exc_type = local_type;
    tstate->exc_value = local_value;
    tstate->exc_traceback = local_tb;
    Py_XDECREF(tmp_type);
    Py_XDECREF(tmp_value);
    Py_XDECREF(tmp_tb);
#else
    PyErr_SetExcInfo(local_type, local_value, local_tb);
#endif
    return 0;
bad:
    *type = 0;
    *value = 0;
    *tb = 0;
    Py_XDECREF(local_type);
    Py_XDECREF(local_value);
    Py_XDECREF(local_tb);
    return -1;
}

static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) {
    PyErr_Format(PyExc_ValueError,
                 "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected);
}

static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) {
    PyErr_Format(PyExc_ValueError,
                 "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack",
                 index, (index == 1) ? "" : "s");
}

static CYTHON_INLINE int __Pyx_IterFinish(void) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyThreadState *tstate = PyThreadState_GET();
    PyObject* exc_type = tstate->curexc_type;
    if (unlikely(exc_type)) {
        if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) {
            PyObject *exc_value, *exc_tb;
            exc_value = tstate->curexc_value;
            exc_tb = tstate->curexc_traceback;
            tstate->curexc_type = 0;
            tstate->curexc_value = 0;
            tstate->curexc_traceback = 0;
            Py_DECREF(exc_type);
            Py_XDECREF(exc_value);
            Py_XDECREF(exc_tb);
            return 0;
        } else {
            return -1;
        }
    }
    return 0;
#else
    if (unlikely(PyErr_Occurred())) {
        if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) {
            PyErr_Clear();
            return 0;
        } else {
            return -1;
        }
    }
    return 0;
#endif
}

static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) {
    if (unlikely(retval)) {
        Py_DECREF(retval);
        __Pyx_RaiseTooManyValuesError(expected);
        return -1;
    } else {
        return __Pyx_IterFinish();
    }
    return 0;
}

static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type) {
    PyObject* fake_module;
    PyTypeObject* cached_type = NULL;
    fake_module = PyImport_AddModule((char*) "_cython_" CYTHON_ABI);
    if (!fake_module) return NULL;
    Py_INCREF(fake_module);
    cached_type = (PyTypeObject*) PyObject_GetAttrString(fake_module, type->tp_name);
    if (cached_type) {
        if (!PyType_Check((PyObject*)cached_type)) {
            PyErr_Format(PyExc_TypeError,
                "Shared Cython type %.200s is not a type object",
                type->tp_name);
            goto bad;
        }
        if (cached_type->tp_basicsize != type->tp_basicsize) {
            PyErr_Format(PyExc_TypeError,
                "Shared Cython type %.200s has the wrong size, try recompiling",
                type->tp_name);
            goto bad;
        }
    } else {
        if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad;
        PyErr_Clear();
        if (PyType_Ready(type) < 0) goto bad;
        if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0)
            goto bad;
        Py_INCREF(type);
        cached_type = type;
    }
done:
    Py_DECREF(fake_module);
    return cached_type;
bad:
    Py_XDECREF(cached_type);
    cached_type = NULL;
    goto done;
}

static PyObject *
__Pyx_CyFunction_get_doc(__pyx_CyFunctionObject *op, CYTHON_UNUSED void *closure)
{
    if (unlikely(op->func_doc == NULL)) {
        if (op->func.m_ml->ml_doc) {
#if PY_MAJOR_VERSION >= 3
            op->func_doc = PyUnicode_FromString(op->func.m_ml->ml_doc);
#else
            op->func_doc = PyString_FromString(op->func.m_ml->ml_doc);
#endif
            if (unlikely(op->func_doc == NULL))
                return NULL;
        } else {
            Py_INCREF(Py_None);
            return Py_None;
        }
    }
    Py_INCREF(op->func_doc);
    return op->func_doc;
}
static int
__Pyx_CyFunction_set_doc(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp = op->func_doc;
    if (value == NULL) {
        value = Py_None;
    }
    Py_INCREF(value);
    op->func_doc = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_name(__pyx_CyFunctionObject *op)
{
    if (unlikely(op->func_name == NULL)) {
#if PY_MAJOR_VERSION >= 3
        op->func_name = PyUnicode_InternFromString(op->func.m_ml->ml_name);
#else
        op->func_name = PyString_InternFromString(op->func.m_ml->ml_name);
#endif
        if (unlikely(op->func_name == NULL))
            return NULL;
    }
    Py_INCREF(op->func_name);
    return op->func_name;
}
static int
__Pyx_CyFunction_set_name(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__name__ must be set to a string object");
        return -1;
    }
    tmp = op->func_name;
    Py_INCREF(value);
    op->func_name = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_qualname(__pyx_CyFunctionObject *op)
{
    Py_INCREF(op->func_qualname);
    return op->func_qualname;
}
static int
__Pyx_CyFunction_set_qualname(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__qualname__ must be set to a string object");
        return -1;
    }
    tmp = op->func_qualname;
    Py_INCREF(value);
    op->func_qualname = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_self(__pyx_CyFunctionObject *m, CYTHON_UNUSED void *closure)
{
    PyObject *self;
    self = m->func_closure;
    if (self == NULL)
        self = Py_None;
    Py_INCREF(self);
    return self;
}
static PyObject *
__Pyx_CyFunction_get_dict(__pyx_CyFunctionObject *op)
{
    if (unlikely(op->func_dict == NULL)) {
        op->func_dict = PyDict_New();
        if (unlikely(op->func_dict == NULL))
            return NULL;
    }
    Py_INCREF(op->func_dict);
    return op->func_dict;
}
static int
__Pyx_CyFunction_set_dict(__pyx_CyFunctionObject *op, PyObject *value)
{
    PyObject *tmp;
    if (unlikely(value == NULL)) {
        PyErr_SetString(PyExc_TypeError,
               "function's dictionary may not be deleted");
        return -1;
    }
    if (unlikely(!PyDict_Check(value))) {
        PyErr_SetString(PyExc_TypeError,
               "setting function's dictionary to a non-dict");
        return -1;
    }
    tmp = op->func_dict;
    Py_INCREF(value);
    op->func_dict = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_globals(__pyx_CyFunctionObject *op)
{
    Py_INCREF(op->func_globals);
    return op->func_globals;
}
static PyObject *
__Pyx_CyFunction_get_closure(CYTHON_UNUSED __pyx_CyFunctionObject *op)
{
    Py_INCREF(Py_None);
    return Py_None;
}
static PyObject *
__Pyx_CyFunction_get_code(__pyx_CyFunctionObject *op)
{
    PyObject* result = (op->func_code) ? op->func_code : Py_None;
    Py_INCREF(result);
    return result;
}
static int
__Pyx_CyFunction_init_defaults(__pyx_CyFunctionObject *op) {
    PyObject *res = op->defaults_getter((PyObject *) op);
    if (unlikely(!res))
        return -1;
    op->defaults_tuple = PyTuple_GET_ITEM(res, 0);
    Py_INCREF(op->defaults_tuple);
    op->defaults_kwdict = PyTuple_GET_ITEM(res, 1);
    Py_INCREF(op->defaults_kwdict);
    Py_DECREF(res);
    return 0;
}
static int
__Pyx_CyFunction_set_defaults(__pyx_CyFunctionObject *op, PyObject* value) {
    PyObject* tmp;
    if (!value) {
        value = Py_None;
    } else if (value != Py_None && !PyTuple_Check(value)) {
        PyErr_SetString(PyExc_TypeError,
                        "__defaults__ must be set to a tuple object");
        return -1;
    }
    Py_INCREF(value);
    tmp = op->defaults_tuple;
    op->defaults_tuple = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_defaults(__pyx_CyFunctionObject *op) {
    PyObject* result = op->defaults_tuple;
    if (unlikely(!result)) {
        if (op->defaults_getter) {
            if (__Pyx_CyFunction_init_defaults(op) < 0) return NULL;
            result = op->defaults_tuple;
        } else {
            result = Py_None;
        }
    }
    Py_INCREF(result);
    return result;
}
static int
__Pyx_CyFunction_set_kwdefaults(__pyx_CyFunctionObject *op, PyObject* value) {
    PyObject* tmp;
    if (!value) {
        value = Py_None;
    } else if (value != Py_None && !PyDict_Check(value)) {
        PyErr_SetString(PyExc_TypeError,
                        "__kwdefaults__ must be set to a dict object");
        return -1;
    }
    Py_INCREF(value);
    tmp = op->defaults_kwdict;
    op->defaults_kwdict = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_kwdefaults(__pyx_CyFunctionObject *op) {
    PyObject* result = op->defaults_kwdict;
    if (unlikely(!result)) {
        if (op->defaults_getter) {
            if (__Pyx_CyFunction_init_defaults(op) < 0) return NULL;
            result = op->defaults_kwdict;
        } else {
            result = Py_None;
        }
    }
    Py_INCREF(result);
    return result;
}
static int
__Pyx_CyFunction_set_annotations(__pyx_CyFunctionObject *op, PyObject* value) {
    PyObject* tmp;
    if (!value || value == Py_None) {
        value = NULL;
    } else if (!PyDict_Check(value)) {
        PyErr_SetString(PyExc_TypeError,
                        "__annotations__ must be set to a dict object");
        return -1;
    }
    Py_XINCREF(value);
    tmp = op->func_annotations;
    op->func_annotations = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_CyFunction_get_annotations(__pyx_CyFunctionObject *op) {
    PyObject* result = op->func_annotations;
    if (unlikely(!result)) {
        result = PyDict_New();
        if (unlikely(!result)) return NULL;
        op->func_annotations = result;
    }
    Py_INCREF(result);
    return result;
}
static PyGetSetDef __pyx_CyFunction_getsets[] = {
    {(char *) "func_doc", (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
    {(char *) "__doc__",  (getter)__Pyx_CyFunction_get_doc, (setter)__Pyx_CyFunction_set_doc, 0, 0},
    {(char *) "func_name", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
    {(char *) "__name__", (getter)__Pyx_CyFunction_get_name, (setter)__Pyx_CyFunction_set_name, 0, 0},
    {(char *) "__qualname__", (getter)__Pyx_CyFunction_get_qualname, (setter)__Pyx_CyFunction_set_qualname, 0, 0},
    {(char *) "__self__", (getter)__Pyx_CyFunction_get_self, 0, 0, 0},
    {(char *) "func_dict", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
    {(char *) "__dict__", (getter)__Pyx_CyFunction_get_dict, (setter)__Pyx_CyFunction_set_dict, 0, 0},
    {(char *) "func_globals", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
    {(char *) "__globals__", (getter)__Pyx_CyFunction_get_globals, 0, 0, 0},
    {(char *) "func_closure", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
    {(char *) "__closure__", (getter)__Pyx_CyFunction_get_closure, 0, 0, 0},
    {(char *) "func_code", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
    {(char *) "__code__", (getter)__Pyx_CyFunction_get_code, 0, 0, 0},
    {(char *) "func_defaults", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0},
    {(char *) "__defaults__", (getter)__Pyx_CyFunction_get_defaults, (setter)__Pyx_CyFunction_set_defaults, 0, 0},
    {(char *) "__kwdefaults__", (getter)__Pyx_CyFunction_get_kwdefaults, (setter)__Pyx_CyFunction_set_kwdefaults, 0, 0},
    {(char *) "__annotations__", (getter)__Pyx_CyFunction_get_annotations, (setter)__Pyx_CyFunction_set_annotations, 0, 0},
    {0, 0, 0, 0, 0}
};
#ifndef PY_WRITE_RESTRICTED
#define PY_WRITE_RESTRICTED WRITE_RESTRICTED
#endif
static PyMemberDef __pyx_CyFunction_members[] = {
    {(char *) "__module__", T_OBJECT, offsetof(__pyx_CyFunctionObject, func.m_module), PY_WRITE_RESTRICTED, 0},
    {0, 0, 0,  0, 0}
};
static PyObject *
__Pyx_CyFunction_reduce(__pyx_CyFunctionObject *m, CYTHON_UNUSED PyObject *args)
{
#if PY_MAJOR_VERSION >= 3
    return PyUnicode_FromString(m->func.m_ml->ml_name);
#else
    return PyString_FromString(m->func.m_ml->ml_name);
#endif
}
static PyMethodDef __pyx_CyFunction_methods[] = {
    {"__reduce__", (PyCFunction)__Pyx_CyFunction_reduce, METH_VARARGS, 0},
    {0, 0, 0, 0}
};
#if PY_VERSION_HEX < 0x030500A0
#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func_weakreflist)
#else
#define __Pyx_CyFunction_weakreflist(cyfunc) ((cyfunc)->func.m_weakreflist)
#endif
static PyObject *__Pyx_CyFunction_New(PyTypeObject *type, PyMethodDef *ml, int flags, PyObject* qualname,
                                      PyObject *closure, PyObject *module, PyObject* globals, PyObject* code) {
    __pyx_CyFunctionObject *op = PyObject_GC_New(__pyx_CyFunctionObject, type);
    if (op == NULL)
        return NULL;
    op->flags = flags;
    __Pyx_CyFunction_weakreflist(op) = NULL;
    op->func.m_ml = ml;
    op->func.m_self = (PyObject *) op;
    Py_XINCREF(closure);
    op->func_closure = closure;
    Py_XINCREF(module);
    op->func.m_module = module;
    op->func_dict = NULL;
    op->func_name = NULL;
    Py_INCREF(qualname);
    op->func_qualname = qualname;
    op->func_doc = NULL;
    op->func_classobj = NULL;
    op->func_globals = globals;
    Py_INCREF(op->func_globals);
    Py_XINCREF(code);
    op->func_code = code;
    op->defaults_pyobjects = 0;
    op->defaults = NULL;
    op->defaults_tuple = NULL;
    op->defaults_kwdict = NULL;
    op->defaults_getter = NULL;
    op->func_annotations = NULL;
    PyObject_GC_Track(op);
    return (PyObject *) op;
}
static int
__Pyx_CyFunction_clear(__pyx_CyFunctionObject *m)
{
    Py_CLEAR(m->func_closure);
    Py_CLEAR(m->func.m_module);
    Py_CLEAR(m->func_dict);
    Py_CLEAR(m->func_name);
    Py_CLEAR(m->func_qualname);
    Py_CLEAR(m->func_doc);
    Py_CLEAR(m->func_globals);
    Py_CLEAR(m->func_code);
    Py_CLEAR(m->func_classobj);
    Py_CLEAR(m->defaults_tuple);
    Py_CLEAR(m->defaults_kwdict);
    Py_CLEAR(m->func_annotations);
    if (m->defaults) {
        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
        int i;
        for (i = 0; i < m->defaults_pyobjects; i++)
            Py_XDECREF(pydefaults[i]);
        PyMem_Free(m->defaults);
        m->defaults = NULL;
    }
    return 0;
}
static void __Pyx_CyFunction_dealloc(__pyx_CyFunctionObject *m)
{
    PyObject_GC_UnTrack(m);
    if (__Pyx_CyFunction_weakreflist(m) != NULL)
        PyObject_ClearWeakRefs((PyObject *) m);
    __Pyx_CyFunction_clear(m);
    PyObject_GC_Del(m);
}
static int __Pyx_CyFunction_traverse(__pyx_CyFunctionObject *m, visitproc visit, void *arg)
{
    Py_VISIT(m->func_closure);
    Py_VISIT(m->func.m_module);
    Py_VISIT(m->func_dict);
    Py_VISIT(m->func_name);
    Py_VISIT(m->func_qualname);
    Py_VISIT(m->func_doc);
    Py_VISIT(m->func_globals);
    Py_VISIT(m->func_code);
    Py_VISIT(m->func_classobj);
    Py_VISIT(m->defaults_tuple);
    Py_VISIT(m->defaults_kwdict);
    if (m->defaults) {
        PyObject **pydefaults = __Pyx_CyFunction_Defaults(PyObject *, m);
        int i;
        for (i = 0; i < m->defaults_pyobjects; i++)
            Py_VISIT(pydefaults[i]);
    }
    return 0;
}
static PyObject *__Pyx_CyFunction_descr_get(PyObject *func, PyObject *obj, PyObject *type)
{
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    if (m->flags & __Pyx_CYFUNCTION_STATICMETHOD) {
        Py_INCREF(func);
        return func;
    }
    if (m->flags & __Pyx_CYFUNCTION_CLASSMETHOD) {
        if (type == NULL)
            type = (PyObject *)(Py_TYPE(obj));
        return __Pyx_PyMethod_New(func, type, (PyObject *)(Py_TYPE(type)));
    }
    if (obj == Py_None)
        obj = NULL;
    return __Pyx_PyMethod_New(func, obj, type);
}
static PyObject*
__Pyx_CyFunction_repr(__pyx_CyFunctionObject *op)
{
#if PY_MAJOR_VERSION >= 3
    return PyUnicode_FromFormat("<cyfunction %U at %p>",
                                op->func_qualname, (void *)op);
#else
    return PyString_FromFormat("<cyfunction %s at %p>",
                               PyString_AsString(op->func_qualname), (void *)op);
#endif
}
#if CYTHON_COMPILING_IN_PYPY
static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
    PyCFunctionObject* f = (PyCFunctionObject*)func;
    PyCFunction meth = PyCFunction_GET_FUNCTION(func);
    PyObject *self = PyCFunction_GET_SELF(func);
    Py_ssize_t size;
    switch (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST)) {
    case METH_VARARGS:
        if (likely(kw == NULL) || PyDict_Size(kw) == 0)
            return (*meth)(self, arg);
        break;
    case METH_VARARGS | METH_KEYWORDS:
        return (*(PyCFunctionWithKeywords)meth)(self, arg, kw);
    case METH_NOARGS:
        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
            size = PyTuple_GET_SIZE(arg);
            if (size == 0)
                return (*meth)(self, NULL);
            PyErr_Format(PyExc_TypeError,
                "%.200s() takes no arguments (%zd given)",
                f->m_ml->ml_name, size);
            return NULL;
        }
        break;
    case METH_O:
        if (likely(kw == NULL) || PyDict_Size(kw) == 0) {
            size = PyTuple_GET_SIZE(arg);
            if (size == 1)
                return (*meth)(self, PyTuple_GET_ITEM(arg, 0));
            PyErr_Format(PyExc_TypeError,
                "%.200s() takes exactly one argument (%zd given)",
                f->m_ml->ml_name, size);
            return NULL;
        }
        break;
    default:
        PyErr_SetString(PyExc_SystemError, "Bad call flags in "
                        "__Pyx_CyFunction_Call. METH_OLDARGS is no "
                        "longer supported!");
        return NULL;
    }
    PyErr_Format(PyExc_TypeError, "%.200s() takes no keyword arguments",
                 f->m_ml->ml_name);
    return NULL;
}
#else
static PyObject * __Pyx_CyFunction_Call(PyObject *func, PyObject *arg, PyObject *kw) {
	return PyCFunction_Call(func, arg, kw);
}
#endif
static PyTypeObject __pyx_CyFunctionType_type = {
    PyVarObject_HEAD_INIT(0, 0)
    "cython_function_or_method",
    sizeof(__pyx_CyFunctionObject),
    0,
    (destructor) __Pyx_CyFunction_dealloc,
    0,
    0,
    0,
#if PY_MAJOR_VERSION < 3
    0,
#else
    0,
#endif
    (reprfunc) __Pyx_CyFunction_repr,
    0,
    0,
    0,
    0,
    __Pyx_CyFunction_Call,
    0,
    0,
    0,
    0,
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,
    0,
    (traverseproc) __Pyx_CyFunction_traverse,
    (inquiry) __Pyx_CyFunction_clear,
    0,
#if PY_VERSION_HEX < 0x030500A0
    offsetof(__pyx_CyFunctionObject, func_weakreflist),
#else
    offsetof(PyCFunctionObject, m_weakreflist),
#endif
    0,
    0,
    __pyx_CyFunction_methods,
    __pyx_CyFunction_members,
    __pyx_CyFunction_getsets,
    0,
    0,
    __Pyx_CyFunction_descr_get,
    0,
    offsetof(__pyx_CyFunctionObject, func_dict),
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
#if PY_VERSION_HEX >= 0x030400a1
    0,
#endif
};
static int __Pyx_CyFunction_init(void) {
#if !CYTHON_COMPILING_IN_PYPY
    __pyx_CyFunctionType_type.tp_call = PyCFunction_Call;
#endif
    __pyx_CyFunctionType = __Pyx_FetchCommonType(&__pyx_CyFunctionType_type);
    if (__pyx_CyFunctionType == NULL) {
        return -1;
    }
    return 0;
}
static CYTHON_INLINE void *__Pyx_CyFunction_InitDefaults(PyObject *func, size_t size, int pyobjects) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->defaults = PyMem_Malloc(size);
    if (!m->defaults)
        return PyErr_NoMemory();
    memset(m->defaults, 0, size);
    m->defaults_pyobjects = pyobjects;
    return m->defaults;
}
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsTuple(PyObject *func, PyObject *tuple) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->defaults_tuple = tuple;
    Py_INCREF(tuple);
}
static CYTHON_INLINE void __Pyx_CyFunction_SetDefaultsKwDict(PyObject *func, PyObject *dict) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->defaults_kwdict = dict;
    Py_INCREF(dict);
}
static CYTHON_INLINE void __Pyx_CyFunction_SetAnnotationsDict(PyObject *func, PyObject *dict) {
    __pyx_CyFunctionObject *m = (__pyx_CyFunctionObject *) func;
    m->func_annotations = dict;
    Py_INCREF(dict);
}

static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) {
    PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable");
}

static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(
        PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop,
        PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice,
        int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) {
#if CYTHON_COMPILING_IN_CPYTHON
    PyMappingMethods* mp;
#if PY_MAJOR_VERSION < 3
    PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence;
    if (likely(ms && ms->sq_slice)) {
        if (!has_cstart) {
            if (_py_start && (*_py_start != Py_None)) {
                cstart = __Pyx_PyIndex_AsSsize_t(*_py_start);
                if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
            } else
                cstart = 0;
        }
        if (!has_cstop) {
            if (_py_stop && (*_py_stop != Py_None)) {
                cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop);
                if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad;
            } else
                cstop = PY_SSIZE_T_MAX;
        }
        if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) {
            Py_ssize_t l = ms->sq_length(obj);
            if (likely(l >= 0)) {
                if (cstop < 0) {
                    cstop += l;
                    if (cstop < 0) cstop = 0;
                }
                if (cstart < 0) {
                    cstart += l;
                    if (cstart < 0) cstart = 0;
                }
            } else {
                if (PyErr_ExceptionMatches(PyExc_OverflowError))
                    PyErr_Clear();
                else
                    goto bad;
            }
        }
        return ms->sq_slice(obj, cstart, cstop);
    }
#endif
    mp = Py_TYPE(obj)->tp_as_mapping;
    if (likely(mp && mp->mp_subscript))
#endif
    {
        PyObject* result;
        PyObject *py_slice, *py_start, *py_stop;
        if (_py_slice) {
            py_slice = *_py_slice;
        } else {
            PyObject* owned_start = NULL;
            PyObject* owned_stop = NULL;
            if (_py_start) {
                py_start = *_py_start;
            } else {
                if (has_cstart) {
                    owned_start = py_start = PyInt_FromSsize_t(cstart);
                    if (unlikely(!py_start)) goto bad;
                } else
                    py_start = Py_None;
            }
            if (_py_stop) {
                py_stop = *_py_stop;
            } else {
                if (has_cstop) {
                    owned_stop = py_stop = PyInt_FromSsize_t(cstop);
                    if (unlikely(!py_stop)) {
                        Py_XDECREF(owned_start);
                        goto bad;
                    }
                } else
                    py_stop = Py_None;
            }
            py_slice = PySlice_New(py_start, py_stop, Py_None);
            Py_XDECREF(owned_start);
            Py_XDECREF(owned_stop);
            if (unlikely(!py_slice)) goto bad;
        }
#if CYTHON_COMPILING_IN_CPYTHON
        result = mp->mp_subscript(obj, py_slice);
#else
        result = PyObject_GetItem(obj, py_slice);
#endif
        if (!_py_slice) {
            Py_DECREF(py_slice);
        }
        return result;
    }
    PyErr_Format(PyExc_TypeError,
        "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name);
bad:
    return NULL;
}

static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) {
#if CYTHON_COMPILING_IN_PYPY
    return PyObject_RichCompareBool(s1, s2, equals);
#else
    if (s1 == s2) {
        return (equals == Py_EQ);
    } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) {
        const char *ps1, *ps2;
        Py_ssize_t length = PyBytes_GET_SIZE(s1);
        if (length != PyBytes_GET_SIZE(s2))
            return (equals == Py_NE);
        ps1 = PyBytes_AS_STRING(s1);
        ps2 = PyBytes_AS_STRING(s2);
        if (ps1[0] != ps2[0]) {
            return (equals == Py_NE);
        } else if (length == 1) {
            return (equals == Py_EQ);
        } else {
            int result = memcmp(ps1, ps2, (size_t)length);
            return (equals == Py_EQ) ? (result == 0) : (result != 0);
        }
    } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) {
        return (equals == Py_NE);
    } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) {
        return (equals == Py_NE);
    } else {
        int result;
        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
        if (!py_result)
            return -1;
        result = __Pyx_PyObject_IsTrue(py_result);
        Py_DECREF(py_result);
        return result;
    }
#endif
}

static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) {
#if CYTHON_COMPILING_IN_PYPY
    return PyObject_RichCompareBool(s1, s2, equals);
#else
#if PY_MAJOR_VERSION < 3
    PyObject* owned_ref = NULL;
#endif
    int s1_is_unicode, s2_is_unicode;
    if (s1 == s2) {
        goto return_eq;
    }
    s1_is_unicode = PyUnicode_CheckExact(s1);
    s2_is_unicode = PyUnicode_CheckExact(s2);
#if PY_MAJOR_VERSION < 3
    if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) {
        owned_ref = PyUnicode_FromObject(s2);
        if (unlikely(!owned_ref))
            return -1;
        s2 = owned_ref;
        s2_is_unicode = 1;
    } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) {
        owned_ref = PyUnicode_FromObject(s1);
        if (unlikely(!owned_ref))
            return -1;
        s1 = owned_ref;
        s1_is_unicode = 1;
    } else if (((!s2_is_unicode) & (!s1_is_unicode))) {
        return __Pyx_PyBytes_Equals(s1, s2, equals);
    }
#endif
    if (s1_is_unicode & s2_is_unicode) {
        Py_ssize_t length;
        int kind;
        void *data1, *data2;
        if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0))
            return -1;
        length = __Pyx_PyUnicode_GET_LENGTH(s1);
        if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) {
            goto return_ne;
        }
        kind = __Pyx_PyUnicode_KIND(s1);
        if (kind != __Pyx_PyUnicode_KIND(s2)) {
            goto return_ne;
        }
        data1 = __Pyx_PyUnicode_DATA(s1);
        data2 = __Pyx_PyUnicode_DATA(s2);
        if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) {
            goto return_ne;
        } else if (length == 1) {
            goto return_eq;
        } else {
            int result = memcmp(data1, data2, (size_t)(length * kind));
            #if PY_MAJOR_VERSION < 3
            Py_XDECREF(owned_ref);
            #endif
            return (equals == Py_EQ) ? (result == 0) : (result != 0);
        }
    } else if ((s1 == Py_None) & s2_is_unicode) {
        goto return_ne;
    } else if ((s2 == Py_None) & s1_is_unicode) {
        goto return_ne;
    } else {
        int result;
        PyObject* py_result = PyObject_RichCompare(s1, s2, equals);
        if (!py_result)
            return -1;
        result = __Pyx_PyObject_IsTrue(py_result);
        Py_DECREF(py_result);
        return result;
    }
return_eq:
    #if PY_MAJOR_VERSION < 3
    Py_XDECREF(owned_ref);
    #endif
    return (equals == Py_EQ);
return_ne:
    #if PY_MAJOR_VERSION < 3
    Py_XDECREF(owned_ref);
    #endif
    return (equals == Py_NE);
#endif
}

static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) {
    if (unlikely(!type)) {
        PyErr_SetString(PyExc_SystemError, "Missing type object");
        return 0;
    }
    if (likely(PyObject_TypeCheck(obj, type)))
        return 1;
    PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s",
                 Py_TYPE(obj)->tp_name, type->tp_name);
    return 0;
}

static CYTHON_INLINE long __Pyx_div_long(long a, long b) {
    long q = a / b;
    long r = a - q*b;
    q -= ((r != 0) & ((r ^ b) < 0));
    return q;
}

static CYTHON_INLINE void __Pyx_RaiseUnboundLocalError(const char *varname) {
    PyErr_Format(PyExc_UnboundLocalError, "local variable '%s' referenced before assignment", varname);
}

static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) {
    PyObject *r;
    if (!j) return NULL;
    r = PyObject_GetItem(o, j);
    Py_DECREF(j);
    return r;
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i,
                                                              int wraparound, int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (wraparound & unlikely(i < 0)) i += PyList_GET_SIZE(o);
    if ((!boundscheck) || likely((0 <= i) & (i < PyList_GET_SIZE(o)))) {
        PyObject *r = PyList_GET_ITEM(o, i);
        Py_INCREF(r);
        return r;
    }
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
#else
    return PySequence_GetItem(o, i);
#endif
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i,
                                                              int wraparound, int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (wraparound & unlikely(i < 0)) i += PyTuple_GET_SIZE(o);
    if ((!boundscheck) || likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) {
        PyObject *r = PyTuple_GET_ITEM(o, i);
        Py_INCREF(r);
        return r;
    }
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
#else
    return PySequence_GetItem(o, i);
#endif
}
static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i,
                                                     int is_list, int wraparound, int boundscheck) {
#if CYTHON_COMPILING_IN_CPYTHON
    if (is_list || PyList_CheckExact(o)) {
        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o);
        if ((!boundscheck) || (likely((n >= 0) & (n < PyList_GET_SIZE(o))))) {
            PyObject *r = PyList_GET_ITEM(o, n);
            Py_INCREF(r);
            return r;
        }
    }
    else if (PyTuple_CheckExact(o)) {
        Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o);
        if ((!boundscheck) || likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) {
            PyObject *r = PyTuple_GET_ITEM(o, n);
            Py_INCREF(r);
            return r;
        }
    } else {
        PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence;
        if (likely(m && m->sq_item)) {
            if (wraparound && unlikely(i < 0) && likely(m->sq_length)) {
                Py_ssize_t l = m->sq_length(o);
                if (likely(l >= 0)) {
                    i += l;
                } else {
                    if (PyErr_ExceptionMatches(PyExc_OverflowError))
                        PyErr_Clear();
                    else
                        return NULL;
                }
            }
            return m->sq_item(o, i);
        }
    }
#else
    if (is_list || PySequence_Check(o)) {
        return PySequence_GetItem(o, i);
    }
#endif
    return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i));
}

static double __Pyx__PyObject_AsDouble(PyObject* obj) {
    PyObject* float_value;
#if CYTHON_COMPILING_IN_PYPY
    float_value = PyNumber_Float(obj);
#else
    PyNumberMethods *nb = Py_TYPE(obj)->tp_as_number;
    if (likely(nb) && likely(nb->nb_float)) {
        float_value = nb->nb_float(obj);
        if (likely(float_value) && unlikely(!PyFloat_Check(float_value))) {
            PyErr_Format(PyExc_TypeError,
                "__float__ returned non-float (type %.200s)",
                Py_TYPE(float_value)->tp_name);
            Py_DECREF(float_value);
            goto bad;
        }
    } else if (PyUnicode_CheckExact(obj) || PyBytes_CheckExact(obj)) {
#if PY_MAJOR_VERSION >= 3
        float_value = PyFloat_FromString(obj);
#else
        float_value = PyFloat_FromString(obj, 0);
#endif
    } else {
        PyObject* args = PyTuple_New(1);
        if (unlikely(!args)) goto bad;
        PyTuple_SET_ITEM(args, 0, obj);
        float_value = PyObject_Call((PyObject*)&PyFloat_Type, args, 0);
        PyTuple_SET_ITEM(args, 0, 0);
        Py_DECREF(args);
    }
#endif
    if (likely(float_value)) {
        double value = PyFloat_AS_DOUBLE(float_value);
        Py_DECREF(float_value);
        return value;
    }
bad:
    return (double)-1;
}

static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno,
                                  CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename,
                                  int full_traceback) {
    PyObject *old_exc, *old_val, *old_tb;
    PyObject *ctx;
    __Pyx_ErrFetch(&old_exc, &old_val, &old_tb);
    if (full_traceback) {
        Py_XINCREF(old_exc);
        Py_XINCREF(old_val);
        Py_XINCREF(old_tb);
        __Pyx_ErrRestore(old_exc, old_val, old_tb);
        PyErr_PrintEx(1);
    }
    #if PY_MAJOR_VERSION < 3
    ctx = PyString_FromString(name);
    #else
    ctx = PyUnicode_FromString(name);
    #endif
    __Pyx_ErrRestore(old_exc, old_val, old_tb);
    if (!ctx) {
        PyErr_WriteUnraisable(Py_None);
    } else {
        PyErr_WriteUnraisable(ctx);
        Py_DECREF(ctx);
    }
}

static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) {
    PyObject* value = __Pyx_PyObject_GetAttrStr(module, name);
    if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) {
        PyErr_Format(PyExc_ImportError,
        #if PY_MAJOR_VERSION < 3
            "cannot import name %.230s", PyString_AS_STRING(name));
        #else
            "cannot import name %S", name);
        #endif
    }
    return value;
}

static PyObject *__Pyx_GetNameInClass(PyObject *nmspace, PyObject *name) {
    PyObject *result;
    result = __Pyx_PyObject_GetAttrStr(nmspace, name);
    if (!result)
        result = __Pyx_GetModuleGlobalName(name);
    return result;
}

static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) {
    int start = 0, mid = 0, end = count - 1;
    if (end >= 0 && code_line > entries[end].code_line) {
        return count;
    }
    while (start < end) {
        mid = (start + end) / 2;
        if (code_line < entries[mid].code_line) {
            end = mid;
        } else if (code_line > entries[mid].code_line) {
             start = mid + 1;
        } else {
            return mid;
        }
    }
    if (code_line <= entries[mid].code_line) {
        return mid;
    } else {
        return mid + 1;
    }
}
static PyCodeObject *__pyx_find_code_object(int code_line) {
    PyCodeObject* code_object;
    int pos;
    if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) {
        return NULL;
    }
    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
    if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) {
        return NULL;
    }
    code_object = __pyx_code_cache.entries[pos].code_object;
    Py_INCREF(code_object);
    return code_object;
}
static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) {
    int pos, i;
    __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries;
    if (unlikely(!code_line)) {
        return;
    }
    if (unlikely(!entries)) {
        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry));
        if (likely(entries)) {
            __pyx_code_cache.entries = entries;
            __pyx_code_cache.max_count = 64;
            __pyx_code_cache.count = 1;
            entries[0].code_line = code_line;
            entries[0].code_object = code_object;
            Py_INCREF(code_object);
        }
        return;
    }
    pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line);
    if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) {
        PyCodeObject* tmp = entries[pos].code_object;
        entries[pos].code_object = code_object;
        Py_DECREF(tmp);
        return;
    }
    if (__pyx_code_cache.count == __pyx_code_cache.max_count) {
        int new_max = __pyx_code_cache.max_count + 64;
        entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc(
            __pyx_code_cache.entries, (size_t)new_max*sizeof(__Pyx_CodeObjectCacheEntry));
        if (unlikely(!entries)) {
            return;
        }
        __pyx_code_cache.entries = entries;
        __pyx_code_cache.max_count = new_max;
    }
    for (i=__pyx_code_cache.count; i>pos; i--) {
        entries[i] = entries[i-1];
    }
    entries[pos].code_line = code_line;
    entries[pos].code_object = code_object;
    __pyx_code_cache.count++;
    Py_INCREF(code_object);
}

#include "compile.h"
#include "frameobject.h"
#include "traceback.h"
static PyCodeObject* __Pyx_CreateCodeObjectForTraceback(
            const char *funcname, int c_line,
            int py_line, const char *filename) {
    PyCodeObject *py_code = 0;
    PyObject *py_srcfile = 0;
    PyObject *py_funcname = 0;
    #if PY_MAJOR_VERSION < 3
    py_srcfile = PyString_FromString(filename);
    #else
    py_srcfile = PyUnicode_FromString(filename);
    #endif
    if (!py_srcfile) goto bad;
    if (c_line) {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
        #else
        py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line);
        #endif
    }
    else {
        #if PY_MAJOR_VERSION < 3
        py_funcname = PyString_FromString(funcname);
        #else
        py_funcname = PyUnicode_FromString(funcname);
        #endif
    }
    if (!py_funcname) goto bad;
    py_code = __Pyx_PyCode_New(
        0,
        0,
        0,
        0,
        0,
        __pyx_empty_bytes, /*PyObject *code,*/
        __pyx_empty_tuple, /*PyObject *consts,*/
        __pyx_empty_tuple, /*PyObject *names,*/
        __pyx_empty_tuple, /*PyObject *varnames,*/
        __pyx_empty_tuple, /*PyObject *freevars,*/
        __pyx_empty_tuple, /*PyObject *cellvars,*/
        py_srcfile,   /*PyObject *filename,*/
        py_funcname,  /*PyObject *name,*/
        py_line,
        __pyx_empty_bytes  /*PyObject *lnotab*/
    );
    Py_DECREF(py_srcfile);
    Py_DECREF(py_funcname);
    return py_code;
bad:
    Py_XDECREF(py_srcfile);
    Py_XDECREF(py_funcname);
    return NULL;
}
static void __Pyx_AddTraceback(const char *funcname, int c_line,
                               int py_line, const char *filename) {
    PyCodeObject *py_code = 0;
    PyFrameObject *py_frame = 0;
    py_code = __pyx_find_code_object(c_line ? c_line : py_line);
    if (!py_code) {
        py_code = __Pyx_CreateCodeObjectForTraceback(
            funcname, c_line, py_line, filename);
        if (!py_code) goto bad;
        __pyx_insert_code_object(c_line ? c_line : py_line, py_code);
    }
    py_frame = PyFrame_New(
        PyThreadState_GET(), /*PyThreadState *tstate,*/
        py_code,             /*PyCodeObject *code,*/
        __pyx_d,      /*PyObject *globals,*/
        0                    /*PyObject *locals*/
    );
    if (!py_frame) goto bad;
    py_frame->f_lineno = py_line;
    PyTraceBack_Here(py_frame);
bad:
    Py_XDECREF(py_code);
    Py_XDECREF(py_frame);
}

static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) {
    PyObject *empty_list = 0;
    PyObject *module = 0;
    PyObject *global_dict = 0;
    PyObject *empty_dict = 0;
    PyObject *list;
    #if PY_VERSION_HEX < 0x03030000
    PyObject *py_import;
    py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import);
    if (!py_import)
        goto bad;
    #endif
    if (from_list)
        list = from_list;
    else {
        empty_list = PyList_New(0);
        if (!empty_list)
            goto bad;
        list = empty_list;
    }
    global_dict = PyModule_GetDict(__pyx_m);
    if (!global_dict)
        goto bad;
    empty_dict = PyDict_New();
    if (!empty_dict)
        goto bad;
    {
        #if PY_MAJOR_VERSION >= 3
        if (level == -1) {
            if (strchr(__Pyx_MODULE_NAME, '.')) {
                #if PY_VERSION_HEX < 0x03030000
                PyObject *py_level = PyInt_FromLong(1);
                if (!py_level)
                    goto bad;
                module = PyObject_CallFunctionObjArgs(py_import,
                    name, global_dict, empty_dict, list, py_level, NULL);
                Py_DECREF(py_level);
                #else
                module = PyImport_ImportModuleLevelObject(
                    name, global_dict, empty_dict, list, 1);
                #endif
                if (!module) {
                    if (!PyErr_ExceptionMatches(PyExc_ImportError))
                        goto bad;
                    PyErr_Clear();
                }
            }
            level = 0;
        }
        #endif
        if (!module) {
            #if PY_VERSION_HEX < 0x03030000
            PyObject *py_level = PyInt_FromLong(level);
            if (!py_level)
                goto bad;
            module = PyObject_CallFunctionObjArgs(py_import,
                name, global_dict, empty_dict, list, py_level, NULL);
            Py_DECREF(py_level);
            #else
            module = PyImport_ImportModuleLevelObject(
                name, global_dict, empty_dict, list, level);
            #endif
        }
    }
bad:
    #if PY_VERSION_HEX < 0x03030000
    Py_XDECREF(py_import);
    #endif
    Py_XDECREF(empty_list);
    Py_XDECREF(empty_dict);
    return module;
}

#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)       \
    {                                                                     \
        func_type value = func_value;                                     \
        if (sizeof(target_type) < sizeof(func_type)) {                    \
            if (unlikely(value != (func_type) (target_type) value)) {     \
                func_type zero = 0;                                       \
                if (is_unsigned && unlikely(value < zero))                \
                    goto raise_neg_overflow;                              \
                else                                                      \
                    goto raise_overflow;                                  \
            }                                                             \
        }                                                                 \
        return (target_type) value;                                       \
    }

#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
  #include "longintrepr.h"
 #endif
#endif

static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) {
    const int neg_one = (int) -1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(int) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x))
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                goto raise_neg_overflow;
            }
            return (int) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
            switch (Py_SIZE(x)) {
                case  0: return 0;
                case  1: __PYX_VERIFY_RETURN_INT(int, digit, ((PyLongObject*)x)->ob_digit[0]);
            }
 #endif
#endif
            if (unlikely(Py_SIZE(x) < 0)) {
                goto raise_neg_overflow;
            }
            if (sizeof(int) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT(int, unsigned long, PyLong_AsUnsignedLong(x))
            } else if (sizeof(int) <= sizeof(unsigned long long)) {
                __PYX_VERIFY_RETURN_INT(int, unsigned long long, PyLong_AsUnsignedLongLong(x))
            }
        } else {
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
            switch (Py_SIZE(x)) {
                case  0: return 0;
                case  1: __PYX_VERIFY_RETURN_INT(int,  digit, +(((PyLongObject*)x)->ob_digit[0]));
                case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
            }
 #endif
#endif
            if (sizeof(int) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT(int, long, PyLong_AsLong(x))
            } else if (sizeof(int) <= sizeof(long long)) {
                __PYX_VERIFY_RETURN_INT(int, long long, PyLong_AsLongLong(x))
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            int val;
            PyObject *v = __Pyx_PyNumber_Int(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (int) -1;
        }
    } else {
        int val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (int) -1;
        val = __Pyx_PyInt_As_int(tmp);
        Py_DECREF(tmp);
        return val;
    }
raise_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "value too large to convert to int");
    return (int) -1;
raise_neg_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "can't convert negative value to int");
    return (int) -1;
}

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) {
    const int neg_one = (int) -1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (is_unsigned) {
        if (sizeof(int) < sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(int) <= sizeof(unsigned long)) {
            return PyLong_FromUnsignedLong((unsigned long) value);
        } else if (sizeof(int) <= sizeof(unsigned long long)) {
            return PyLong_FromUnsignedLongLong((unsigned long long) value);
        }
    } else {
        if (sizeof(int) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(int) <= sizeof(long long)) {
            return PyLong_FromLongLong((long long) value);
        }
    }
    {
        int one = 1; int little = (int)*(unsigned char *)&one;
        unsigned char *bytes = (unsigned char *)&value;
        return _PyLong_FromByteArray(bytes, sizeof(int),
                                     little, !is_unsigned);
    }
}

static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) {
    const long neg_one = (long) -1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
    if (is_unsigned) {
        if (sizeof(long) < sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(long) <= sizeof(unsigned long)) {
            return PyLong_FromUnsignedLong((unsigned long) value);
        } else if (sizeof(long) <= sizeof(unsigned long long)) {
            return PyLong_FromUnsignedLongLong((unsigned long long) value);
        }
    } else {
        if (sizeof(long) <= sizeof(long)) {
            return PyInt_FromLong((long) value);
        } else if (sizeof(long) <= sizeof(long long)) {
            return PyLong_FromLongLong((long long) value);
        }
    }
    {
        int one = 1; int little = (int)*(unsigned char *)&one;
        unsigned char *bytes = (unsigned char *)&value;
        return _PyLong_FromByteArray(bytes, sizeof(long),
                                     little, !is_unsigned);
    }
}

static CYTHON_INLINE long __Pyx_pow_long(long b, long e) {
    long t = b;
    switch (e) {
        case 3:
            t *= b;
        case 2:
            t *= b;
        case 1:
            return t;
        case 0:
            return 1;
    }
    #if 1
    if (unlikely(e<0)) return 0;
    #endif
    t = 1;
    while (likely(e)) {
        t *= (b * (e&1)) | ((~e)&1);    /* 1 or b */
        b *= b;
        e >>= 1;
    }
    return t;
}

static PyObject* __Pyx_Method_ClassMethod(PyObject *method) {
#if CYTHON_COMPILING_IN_PYPY
    if (PyObject_TypeCheck(method, &PyWrapperDescr_Type)) {
        return PyClassMethod_New(method);
    }
#else
    static PyTypeObject *methoddescr_type = NULL;
    if (methoddescr_type == NULL) {
       PyObject *meth = PyObject_GetAttrString((PyObject*)&PyList_Type, "append");
       if (!meth) return NULL;
       methoddescr_type = Py_TYPE(meth);
       Py_DECREF(meth);
    }
    if (PyObject_TypeCheck(method, methoddescr_type)) {
        PyMethodDescrObject *descr = (PyMethodDescrObject *)method;
        #if PY_VERSION_HEX < 0x03020000
        PyTypeObject *d_type = descr->d_type;
        #else
        PyTypeObject *d_type = descr->d_common.d_type;
        #endif
        return PyDescr_NewClassMethod(d_type, descr->d_method);
    }
#endif
    else if (PyMethod_Check(method)) {
        return PyClassMethod_New(PyMethod_GET_FUNCTION(method));
    }
    else if (PyCFunction_Check(method)) {
        return PyClassMethod_New(method);
    }
#ifdef __Pyx_CyFunction_USED
    else if (PyObject_TypeCheck(method, __pyx_CyFunctionType)) {
        return PyClassMethod_New(method);
    }
#endif
    PyErr_SetString(PyExc_TypeError,
                   "Class-level classmethod() can only be called on "
                   "a method_descriptor or instance method.");
    return NULL;
}

static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) {
    const long neg_one = (long) -1, const_zero = 0;
    const int is_unsigned = neg_one > const_zero;
#if PY_MAJOR_VERSION < 3
    if (likely(PyInt_Check(x))) {
        if (sizeof(long) < sizeof(long)) {
            __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x))
        } else {
            long val = PyInt_AS_LONG(x);
            if (is_unsigned && unlikely(val < 0)) {
                goto raise_neg_overflow;
            }
            return (long) val;
        }
    } else
#endif
    if (likely(PyLong_Check(x))) {
        if (is_unsigned) {
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
            switch (Py_SIZE(x)) {
                case  0: return 0;
                case  1: __PYX_VERIFY_RETURN_INT(long, digit, ((PyLongObject*)x)->ob_digit[0]);
            }
 #endif
#endif
            if (unlikely(Py_SIZE(x) < 0)) {
                goto raise_neg_overflow;
            }
            if (sizeof(long) <= sizeof(unsigned long)) {
                __PYX_VERIFY_RETURN_INT(long, unsigned long, PyLong_AsUnsignedLong(x))
            } else if (sizeof(long) <= sizeof(unsigned long long)) {
                __PYX_VERIFY_RETURN_INT(long, unsigned long long, PyLong_AsUnsignedLongLong(x))
            }
        } else {
#if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
 #if CYTHON_USE_PYLONG_INTERNALS
            switch (Py_SIZE(x)) {
                case  0: return 0;
                case  1: __PYX_VERIFY_RETURN_INT(long,  digit, +(((PyLongObject*)x)->ob_digit[0]));
                case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, -(sdigit) ((PyLongObject*)x)->ob_digit[0]);
            }
 #endif
#endif
            if (sizeof(long) <= sizeof(long)) {
                __PYX_VERIFY_RETURN_INT(long, long, PyLong_AsLong(x))
            } else if (sizeof(long) <= sizeof(long long)) {
                __PYX_VERIFY_RETURN_INT(long, long long, PyLong_AsLongLong(x))
            }
        }
        {
#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray)
            PyErr_SetString(PyExc_RuntimeError,
                            "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers");
#else
            long val;
            PyObject *v = __Pyx_PyNumber_Int(x);
 #if PY_MAJOR_VERSION < 3
            if (likely(v) && !PyLong_Check(v)) {
                PyObject *tmp = v;
                v = PyNumber_Long(tmp);
                Py_DECREF(tmp);
            }
 #endif
            if (likely(v)) {
                int one = 1; int is_little = (int)*(unsigned char *)&one;
                unsigned char *bytes = (unsigned char *)&val;
                int ret = _PyLong_AsByteArray((PyLongObject *)v,
                                              bytes, sizeof(val),
                                              is_little, !is_unsigned);
                Py_DECREF(v);
                if (likely(!ret))
                    return val;
            }
#endif
            return (long) -1;
        }
    } else {
        long val;
        PyObject *tmp = __Pyx_PyNumber_Int(x);
        if (!tmp) return (long) -1;
        val = __Pyx_PyInt_As_long(tmp);
        Py_DECREF(tmp);
        return val;
    }
raise_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "value too large to convert to long");
    return (long) -1;
raise_neg_overflow:
    PyErr_SetString(PyExc_OverflowError,
        "can't convert negative value to long");
    return (long) -1;
}

static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) {
    PyObject *tmp_type, *tmp_value, *tmp_tb;
#if CYTHON_COMPILING_IN_CPYTHON
    PyThreadState *tstate = PyThreadState_GET();
    tmp_type = tstate->exc_type;
    tmp_value = tstate->exc_value;
    tmp_tb = tstate->exc_traceback;
    tstate->exc_type = *type;
    tstate->exc_value = *value;
    tstate->exc_traceback = *tb;
#else
    PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb);
    PyErr_SetExcInfo(*type, *value, *tb);
#endif
    *type = tmp_type;
    *value = tmp_value;
    *tb = tmp_tb;
}

static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) {
    PyObject *method, *result = NULL;
    method = __Pyx_PyObject_GetAttrStr(obj, method_name);
    if (unlikely(!method)) goto bad;
#if CYTHON_COMPILING_IN_CPYTHON
    if (likely(PyMethod_Check(method))) {
        PyObject *self = PyMethod_GET_SELF(method);
        if (likely(self)) {
            PyObject *args;
            PyObject *function = PyMethod_GET_FUNCTION(method);
            args = PyTuple_New(2);
            if (unlikely(!args)) goto bad;
            Py_INCREF(self);
            PyTuple_SET_ITEM(args, 0, self);
            Py_INCREF(arg);
            PyTuple_SET_ITEM(args, 1, arg);
            Py_INCREF(function);
            Py_DECREF(method); method = NULL;
            result = __Pyx_PyObject_Call(function, args, NULL);
            Py_DECREF(args);
            Py_DECREF(function);
            return result;
        }
    }
#endif
    result = __Pyx_PyObject_CallOneArg(method, arg);
bad:
    Py_XDECREF(method);
    return result;
}

static PyObject *__Pyx_Generator_Next(PyObject *self);
static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value);
static PyObject *__Pyx_Generator_Close(PyObject *self);
static PyObject *__Pyx_Generator_Throw(PyObject *gen, PyObject *args);
static PyTypeObject *__pyx_GeneratorType = 0;
#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType)
#define __Pyx_Generator_Undelegate(gen) Py_CLEAR((gen)->yieldfrom)
#if 1 || PY_VERSION_HEX < 0x030300B0
static int __Pyx_PyGen_FetchStopIterationValue(PyObject **pvalue) {
    PyObject *et, *ev, *tb;
    PyObject *value = NULL;
    __Pyx_ErrFetch(&et, &ev, &tb);
    if (!et) {
        Py_XDECREF(tb);
        Py_XDECREF(ev);
        Py_INCREF(Py_None);
        *pvalue = Py_None;
        return 0;
    }
    if (unlikely(et != PyExc_StopIteration) &&
            unlikely(!PyErr_GivenExceptionMatches(et, PyExc_StopIteration))) {
        __Pyx_ErrRestore(et, ev, tb);
        return -1;
    }
    if (likely(et == PyExc_StopIteration)) {
        if (likely(!ev) || !PyObject_IsInstance(ev, PyExc_StopIteration)) {
            if (!ev) {
                Py_INCREF(Py_None);
                ev = Py_None;
            }
            Py_XDECREF(tb);
            Py_DECREF(et);
            *pvalue = ev;
            return 0;
        }
    }
    PyErr_NormalizeException(&et, &ev, &tb);
    if (unlikely(!PyObject_IsInstance(ev, PyExc_StopIteration))) {
        __Pyx_ErrRestore(et, ev, tb);
        return -1;
    }
    Py_XDECREF(tb);
    Py_DECREF(et);
#if PY_VERSION_HEX >= 0x030300A0
    value = ((PyStopIterationObject *)ev)->value;
    Py_INCREF(value);
    Py_DECREF(ev);
#else
    {
        PyObject* args = PyObject_GetAttr(ev, __pyx_n_s_args);
        Py_DECREF(ev);
        if (likely(args)) {
            value = PyObject_GetItem(args, 0);
            Py_DECREF(args);
        }
        if (unlikely(!value)) {
            __Pyx_ErrRestore(NULL, NULL, NULL);
            Py_INCREF(Py_None);
            value = Py_None;
        }
    }
#endif
    *pvalue = value;
    return 0;
}
#endif
static CYTHON_INLINE
void __Pyx_Generator_ExceptionClear(__pyx_GeneratorObject *self) {
    PyObject *exc_type = self->exc_type;
    PyObject *exc_value = self->exc_value;
    PyObject *exc_traceback = self->exc_traceback;
    self->exc_type = NULL;
    self->exc_value = NULL;
    self->exc_traceback = NULL;
    Py_XDECREF(exc_type);
    Py_XDECREF(exc_value);
    Py_XDECREF(exc_traceback);
}
static CYTHON_INLINE
int __Pyx_Generator_CheckRunning(__pyx_GeneratorObject *gen) {
    if (unlikely(gen->is_running)) {
        PyErr_SetString(PyExc_ValueError,
                        "generator already executing");
        return 1;
    }
    return 0;
}
static CYTHON_INLINE
PyObject *__Pyx_Generator_SendEx(__pyx_GeneratorObject *self, PyObject *value) {
    PyObject *retval;
    assert(!self->is_running);
    if (unlikely(self->resume_label == 0)) {
        if (unlikely(value && value != Py_None)) {
            PyErr_SetString(PyExc_TypeError,
                            "can't send non-None value to a "
                            "just-started generator");
            return NULL;
        }
    }
    if (unlikely(self->resume_label == -1)) {
        PyErr_SetNone(PyExc_StopIteration);
        return NULL;
    }
    if (value) {
#if CYTHON_COMPILING_IN_PYPY
#else
        if (self->exc_traceback) {
            PyThreadState *tstate = PyThreadState_GET();
            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
            PyFrameObject *f = tb->tb_frame;
            Py_XINCREF(tstate->frame);
            assert(f->f_back == NULL);
            f->f_back = tstate->frame;
        }
#endif
        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
                            &self->exc_traceback);
    } else {
        __Pyx_Generator_ExceptionClear(self);
    }
    self->is_running = 1;
    retval = self->body((PyObject *) self, value);
    self->is_running = 0;
    if (retval) {
        __Pyx_ExceptionSwap(&self->exc_type, &self->exc_value,
                            &self->exc_traceback);
#if CYTHON_COMPILING_IN_PYPY
#else
        if (self->exc_traceback) {
            PyTracebackObject *tb = (PyTracebackObject *) self->exc_traceback;
            PyFrameObject *f = tb->tb_frame;
            Py_CLEAR(f->f_back);
        }
#endif
    } else {
        __Pyx_Generator_ExceptionClear(self);
    }
    return retval;
}
static CYTHON_INLINE
PyObject *__Pyx_Generator_FinishDelegation(__pyx_GeneratorObject *gen) {
    PyObject *ret;
    PyObject *val = NULL;
    __Pyx_Generator_Undelegate(gen);
    __Pyx_PyGen_FetchStopIterationValue(&val);
    ret = __Pyx_Generator_SendEx(gen, val);
    Py_XDECREF(val);
    return ret;
}
static PyObject *__Pyx_Generator_Next(PyObject *self) {
    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
    PyObject *yf = gen->yieldfrom;
    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        gen->is_running = 1;
        ret = Py_TYPE(yf)->tp_iternext(yf);
        gen->is_running = 0;
        if (likely(ret)) {
            return ret;
        }
        return __Pyx_Generator_FinishDelegation(gen);
    }
    return __Pyx_Generator_SendEx(gen, Py_None);
}
static PyObject *__Pyx_Generator_Send(PyObject *self, PyObject *value) {
    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject*) self;
    PyObject *yf = gen->yieldfrom;
    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        gen->is_running = 1;
        if (__Pyx_Generator_CheckExact(yf)) {
            ret = __Pyx_Generator_Send(yf, value);
        } else {
            if (value == Py_None)
                ret = PyIter_Next(yf);
            else
                ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value);
        }
        gen->is_running = 0;
        if (likely(ret)) {
            return ret;
        }
        return __Pyx_Generator_FinishDelegation(gen);
    }
    return __Pyx_Generator_SendEx(gen, value);
}
static int __Pyx_Generator_CloseIter(__pyx_GeneratorObject *gen, PyObject *yf) {
    PyObject *retval = NULL;
    int err = 0;
    if (__Pyx_Generator_CheckExact(yf)) {
        retval = __Pyx_Generator_Close(yf);
        if (!retval)
            return -1;
    } else {
        PyObject *meth;
        gen->is_running = 1;
        meth = PyObject_GetAttr(yf, __pyx_n_s_close);
        if (unlikely(!meth)) {
            if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
                PyErr_WriteUnraisable(yf);
            }
            PyErr_Clear();
        } else {
            retval = PyObject_CallFunction(meth, NULL);
            Py_DECREF(meth);
            if (!retval)
                err = -1;
        }
        gen->is_running = 0;
    }
    Py_XDECREF(retval);
    return err;
}
static PyObject *__Pyx_Generator_Close(PyObject *self) {
    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
    PyObject *retval, *raised_exception;
    PyObject *yf = gen->yieldfrom;
    int err = 0;
    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
        return NULL;
    if (yf) {
        Py_INCREF(yf);
        err = __Pyx_Generator_CloseIter(gen, yf);
        __Pyx_Generator_Undelegate(gen);
        Py_DECREF(yf);
    }
    if (err == 0)
        PyErr_SetNone(PyExc_GeneratorExit);
    retval = __Pyx_Generator_SendEx(gen, NULL);
    if (retval) {
        Py_DECREF(retval);
        PyErr_SetString(PyExc_RuntimeError,
                        "generator ignored GeneratorExit");
        return NULL;
    }
    raised_exception = PyErr_Occurred();
    if (!raised_exception
        || raised_exception == PyExc_StopIteration
        || raised_exception == PyExc_GeneratorExit
        || PyErr_GivenExceptionMatches(raised_exception, PyExc_GeneratorExit)
        || PyErr_GivenExceptionMatches(raised_exception, PyExc_StopIteration))
    {
        if (raised_exception) PyErr_Clear();
        Py_INCREF(Py_None);
        return Py_None;
    }
    return NULL;
}
static PyObject *__Pyx_Generator_Throw(PyObject *self, PyObject *args) {
    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
    PyObject *typ;
    PyObject *tb = NULL;
    PyObject *val = NULL;
    PyObject *yf = gen->yieldfrom;
    if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb))
        return NULL;
    if (unlikely(__Pyx_Generator_CheckRunning(gen)))
        return NULL;
    if (yf) {
        PyObject *ret;
        Py_INCREF(yf);
        if (PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit)) {
            int err = __Pyx_Generator_CloseIter(gen, yf);
            Py_DECREF(yf);
            __Pyx_Generator_Undelegate(gen);
            if (err < 0)
                return __Pyx_Generator_SendEx(gen, NULL);
            goto throw_here;
        }
        gen->is_running = 1;
        if (__Pyx_Generator_CheckExact(yf)) {
            ret = __Pyx_Generator_Throw(yf, args);
        } else {
            PyObject *meth = PyObject_GetAttr(yf, __pyx_n_s_throw);
            if (unlikely(!meth)) {
                Py_DECREF(yf);
                if (!PyErr_ExceptionMatches(PyExc_AttributeError)) {
                    gen->is_running = 0;
                    return NULL;
                }
                PyErr_Clear();
                __Pyx_Generator_Undelegate(gen);
                gen->is_running = 0;
                goto throw_here;
            }
            ret = PyObject_CallObject(meth, args);
            Py_DECREF(meth);
        }
        gen->is_running = 0;
        Py_DECREF(yf);
        if (!ret) {
            ret = __Pyx_Generator_FinishDelegation(gen);
        }
        return ret;
    }
throw_here:
    __Pyx_Raise(typ, val, tb, NULL);
    return __Pyx_Generator_SendEx(gen, NULL);
}
static int __Pyx_Generator_traverse(PyObject *self, visitproc visit, void *arg) {
    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
    Py_VISIT(gen->closure);
    Py_VISIT(gen->classobj);
    Py_VISIT(gen->yieldfrom);
    Py_VISIT(gen->exc_type);
    Py_VISIT(gen->exc_value);
    Py_VISIT(gen->exc_traceback);
    return 0;
}
static int __Pyx_Generator_clear(PyObject *self) {
    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
    Py_CLEAR(gen->closure);
    Py_CLEAR(gen->classobj);
    Py_CLEAR(gen->yieldfrom);
    Py_CLEAR(gen->exc_type);
    Py_CLEAR(gen->exc_value);
    Py_CLEAR(gen->exc_traceback);
    Py_CLEAR(gen->gi_name);
    Py_CLEAR(gen->gi_qualname);
    return 0;
}
static void __Pyx_Generator_dealloc(PyObject *self) {
    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
    PyObject_GC_UnTrack(gen);
    if (gen->gi_weakreflist != NULL)
        PyObject_ClearWeakRefs(self);
    if (gen->resume_label > 0) {
        PyObject_GC_Track(self);
#if PY_VERSION_HEX >= 0x030400a1
        if (PyObject_CallFinalizerFromDealloc(self))
#else
        Py_TYPE(gen)->tp_del(self);
        if (self->ob_refcnt > 0)
#endif
        {
            return;
        }
        PyObject_GC_UnTrack(self);
    }
    __Pyx_Generator_clear(self);
    PyObject_GC_Del(gen);
}
static void __Pyx_Generator_del(PyObject *self) {
    PyObject *res;
    PyObject *error_type, *error_value, *error_traceback;
    __pyx_GeneratorObject *gen = (__pyx_GeneratorObject *) self;
    if (gen->resume_label <= 0)
        return ;
#if PY_VERSION_HEX < 0x030400a1
    assert(self->ob_refcnt == 0);
    self->ob_refcnt = 1;
#endif
    __Pyx_ErrFetch(&error_type, &error_value, &error_traceback);
    res = __Pyx_Generator_Close(self);
    if (res == NULL)
        PyErr_WriteUnraisable(self);
    else
        Py_DECREF(res);
    __Pyx_ErrRestore(error_type, error_value, error_traceback);
#if PY_VERSION_HEX < 0x030400a1
    assert(self->ob_refcnt > 0);
    if (--self->ob_refcnt == 0) {
        return;
    }
    {
        Py_ssize_t refcnt = self->ob_refcnt;
        _Py_NewReference(self);
        self->ob_refcnt = refcnt;
    }
#if CYTHON_COMPILING_IN_CPYTHON
    assert(PyType_IS_GC(self->ob_type) &&
           _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED);
    _Py_DEC_REFTOTAL;
#endif
#ifdef COUNT_ALLOCS
    --Py_TYPE(self)->tp_frees;
    --Py_TYPE(self)->tp_allocs;
#endif
#endif
}
static PyObject *
__Pyx_Generator_get_name(__pyx_GeneratorObject *self)
{
    Py_INCREF(self->gi_name);
    return self->gi_name;
}
static int
__Pyx_Generator_set_name(__pyx_GeneratorObject *self, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__name__ must be set to a string object");
        return -1;
    }
    tmp = self->gi_name;
    Py_INCREF(value);
    self->gi_name = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyObject *
__Pyx_Generator_get_qualname(__pyx_GeneratorObject *self)
{
    Py_INCREF(self->gi_qualname);
    return self->gi_qualname;
}
static int
__Pyx_Generator_set_qualname(__pyx_GeneratorObject *self, PyObject *value)
{
    PyObject *tmp;
#if PY_MAJOR_VERSION >= 3
    if (unlikely(value == NULL || !PyUnicode_Check(value))) {
#else
    if (unlikely(value == NULL || !PyString_Check(value))) {
#endif
        PyErr_SetString(PyExc_TypeError,
                        "__qualname__ must be set to a string object");
        return -1;
    }
    tmp = self->gi_qualname;
    Py_INCREF(value);
    self->gi_qualname = value;
    Py_XDECREF(tmp);
    return 0;
}
static PyGetSetDef __pyx_Generator_getsets[] = {
    {(char *) "__name__", (getter)__Pyx_Generator_get_name, (setter)__Pyx_Generator_set_name,
     (char*) PyDoc_STR("name of the generator"), 0},
    {(char *) "__qualname__", (getter)__Pyx_Generator_get_qualname, (setter)__Pyx_Generator_set_qualname,
     (char*) PyDoc_STR("qualified name of the generator"), 0},
    {0, 0, 0, 0, 0}
};
static PyMemberDef __pyx_Generator_memberlist[] = {
    {(char *) "gi_running", T_BOOL, offsetof(__pyx_GeneratorObject, is_running), READONLY, NULL},
    {0, 0, 0, 0, 0}
};
static PyMethodDef __pyx_Generator_methods[] = {
    {"send", (PyCFunction) __Pyx_Generator_Send, METH_O, 0},
    {"throw", (PyCFunction) __Pyx_Generator_Throw, METH_VARARGS, 0},
    {"close", (PyCFunction) __Pyx_Generator_Close, METH_NOARGS, 0},
    {0, 0, 0, 0}
};
static PyTypeObject __pyx_GeneratorType_type = {
    PyVarObject_HEAD_INIT(0, 0)
    "generator",
    sizeof(__pyx_GeneratorObject),
    0,
    (destructor) __Pyx_Generator_dealloc,
    0,
    0,
    0,
#if PY_MAJOR_VERSION < 3
    0,
#else
    0,
#endif
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE,
    0,
    (traverseproc) __Pyx_Generator_traverse,
    0,
    0,
    offsetof(__pyx_GeneratorObject, gi_weakreflist),
    0,
    (iternextfunc) __Pyx_Generator_Next,
    __pyx_Generator_methods,
    __pyx_Generator_memberlist,
    __pyx_Generator_getsets,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0,
#if PY_VERSION_HEX >= 0x030400a1
    0,
#else
    __Pyx_Generator_del,
#endif
    0,
#if PY_VERSION_HEX >= 0x030400a1
    __Pyx_Generator_del,
#endif
};
static __pyx_GeneratorObject *__Pyx_Generator_New(__pyx_generator_body_t body,
                                                  PyObject *closure, PyObject *name, PyObject *qualname) {
    __pyx_GeneratorObject *gen =
        PyObject_GC_New(__pyx_GeneratorObject, &__pyx_GeneratorType_type);
    if (gen == NULL)
        return NULL;
    gen->body = body;
    gen->closure = closure;
    Py_XINCREF(closure);
    gen->is_running = 0;
    gen->resume_label = 0;
    gen->classobj = NULL;
    gen->yieldfrom = NULL;
    gen->exc_type = NULL;
    gen->exc_value = NULL;
    gen->exc_traceback = NULL;
    gen->gi_weakreflist = NULL;
    Py_XINCREF(qualname);
    gen->gi_qualname = qualname;
    Py_XINCREF(name);
    gen->gi_name = name;
    PyObject_GC_Track(gen);
    return gen;
}
static int __pyx_Generator_init(void) {
    __pyx_GeneratorType_type.tp_getattro = PyObject_GenericGetAttr;
    __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter;
    __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type);
    if (__pyx_GeneratorType == NULL) {
        return -1;
    }
    return 0;
}

static int __Pyx_check_binary_version(void) {
    char ctversion[4], rtversion[4];
    PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION);
    PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion());
    if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) {
        char message[200];
        PyOS_snprintf(message, sizeof(message),
                      "compiletime version %s of module '%.100s' "
                      "does not match runtime version %s",
                      ctversion, __Pyx_MODULE_NAME, rtversion);
        return PyErr_WarnEx(NULL, message, 1);
    }
    return 0;
}

static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) {
    while (t->p) {
        #if PY_MAJOR_VERSION < 3
        if (t->is_unicode) {
            *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL);
        } else if (t->intern) {
            *t->p = PyString_InternFromString(t->s);
        } else {
            *t->p = PyString_FromStringAndSize(t->s, t->n - 1);
        }
        #else
        if (t->is_unicode | t->is_str) {
            if (t->intern) {
                *t->p = PyUnicode_InternFromString(t->s);
            } else if (t->encoding) {
                *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL);
            } else {
                *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1);
            }
        } else {
            *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1);
        }
        #endif
        if (!*t->p)
            return -1;
        ++t;
    }
    return 0;
}

static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) {
    return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str));
}
static CYTHON_INLINE char* __Pyx_PyObject_AsString(PyObject* o) {
    Py_ssize_t ignore;
    return __Pyx_PyObject_AsStringAndSize(o, &ignore);
}
static CYTHON_INLINE char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) {
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT
    if (
#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
            __Pyx_sys_getdefaultencoding_not_ascii &&
#endif
            PyUnicode_Check(o)) {
#if PY_VERSION_HEX < 0x03030000
        char* defenc_c;
        PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL);
        if (!defenc) return NULL;
        defenc_c = PyBytes_AS_STRING(defenc);
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
        {
            char* end = defenc_c + PyBytes_GET_SIZE(defenc);
            char* c;
            for (c = defenc_c; c < end; c++) {
                if ((unsigned char) (*c) >= 128) {
                    PyUnicode_AsASCIIString(o);
                    return NULL;
                }
            }
        }
#endif
        *length = PyBytes_GET_SIZE(defenc);
        return defenc_c;
#else
        if (__Pyx_PyUnicode_READY(o) == -1) return NULL;
#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII
        if (PyUnicode_IS_ASCII(o)) {
            *length = PyUnicode_GET_LENGTH(o);
            return PyUnicode_AsUTF8(o);
        } else {
            PyUnicode_AsASCIIString(o);
            return NULL;
        }
#else
        return PyUnicode_AsUTF8AndSize(o, length);
#endif
#endif
    } else
#endif
#if !CYTHON_COMPILING_IN_PYPY
    if (PyByteArray_Check(o)) {
        *length = PyByteArray_GET_SIZE(o);
        return PyByteArray_AS_STRING(o);
    } else
#endif
    {
        char* result;
        int r = PyBytes_AsStringAndSize(o, &result, length);
        if (unlikely(r < 0)) {
            return NULL;
        } else {
            return result;
        }
    }
}
static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) {
   int is_true = x == Py_True;
   if (is_true | (x == Py_False) | (x == Py_None)) return is_true;
   else return PyObject_IsTrue(x);
}
static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) {
  PyNumberMethods *m;
  const char *name = NULL;
  PyObject *res = NULL;
#if PY_MAJOR_VERSION < 3
  if (PyInt_Check(x) || PyLong_Check(x))
#else
  if (PyLong_Check(x))
#endif
    return Py_INCREF(x), x;
  m = Py_TYPE(x)->tp_as_number;
#if PY_MAJOR_VERSION < 3
  if (m && m->nb_int) {
    name = "int";
    res = PyNumber_Int(x);
  }
  else if (m && m->nb_long) {
    name = "long";
    res = PyNumber_Long(x);
  }
#else
  if (m && m->nb_int) {
    name = "int";
    res = PyNumber_Long(x);
  }
#endif
  if (res) {
#if PY_MAJOR_VERSION < 3
    if (!PyInt_Check(res) && !PyLong_Check(res)) {
#else
    if (!PyLong_Check(res)) {
#endif
      PyErr_Format(PyExc_TypeError,
                   "__%.4s__ returned non-%.4s (type %.200s)",
                   name, name, Py_TYPE(res)->tp_name);
      Py_DECREF(res);
      return NULL;
    }
  }
  else if (!PyErr_Occurred()) {
    PyErr_SetString(PyExc_TypeError,
                    "an integer is required");
  }
  return res;
}
static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) {
  Py_ssize_t ival;
  PyObject *x;
#if PY_MAJOR_VERSION < 3
  if (likely(PyInt_CheckExact(b)))
      return PyInt_AS_LONG(b);
#endif
  if (likely(PyLong_CheckExact(b))) {
    #if CYTHON_COMPILING_IN_CPYTHON && PY_MAJOR_VERSION >= 3
     #if CYTHON_USE_PYLONG_INTERNALS
       switch (Py_SIZE(b)) {
       case -1: return -(sdigit)((PyLongObject*)b)->ob_digit[0];
       case  0: return 0;
       case  1: return ((PyLongObject*)b)->ob_digit[0];
       }
     #endif
    #endif
    return PyLong_AsSsize_t(b);
  }
  x = PyNumber_Index(b);
  if (!x) return -1;
  ival = PyInt_AsSsize_t(x);
  Py_DECREF(x);
  return ival;
}
static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) {
    return PyInt_FromSize_t(ival);
}


#endif /* Py_PYTHON_H */
